2009-04-21 8 views
9

Soy muy nuevo en la programación de iPhone y me encuentro con un poco de rareza. Para la siguiente clase, el método init nunca se llama - Tengo una función NSLog que debería decirme cuándo se ejecuta init. Aquí está el código correspondiente:El método de inicio del iPhone UIViewController no se llama

@interface MyViewController : UIViewController { 
} 
@end 

@implementation MyViewController 
- (id) init 
{ 
    NSLog(@"init invoked"); 
    return self; 
} 
@end 

¿Alguna idea de lo que estoy haciendo mal? ¿Alguna vez? Espero haber proporcionado suficiente información.

Gracias.

Respuesta

3

¿Se acerca la vista? Utilizar estos métodos para la inicialización adicional:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    //... 
} 

// Implement viewDidLoad to do additional setup after loading the view. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //.. 
} 
+0

Gracias! Eso funciono. Aunque deja un poco de sabor agrio en mi boca para ver algunas inconsistencias en Obj-C en iPhone. Oh bien. – farhany

22

Usted probablemente está creando su controlador de vista de un archivo SEMILLA. Así, en lugar de llamar mensaje "init", este es el mensaje de un creador que se llama:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
    } 
    return self; 
} 

probar si que es la que se llama. Lo que Sean dijo es verdad. Podría usar esos mensajes para lograr cosas similares.

Buena suerte.

+1

Tiene toda la razón. ¡Gracias por el aporte! – farhany

+0

Inmediatamente después de publicar mi comentario anterior, me di cuenta de por qué no se llamaba init ...: P – farhany

+0

El inicializador designado. Anule si crea el controlador ** programáticamente ** y desea realizar una personalización que no sea apropiada para viewDidLoad. –

1

Consulte 'inicializador designado' también en el documento de referencia.

2

Pero, un componente de la interfaz de usuario tiene a veces varios métodos init *, ¿tenemos que anular todos estos métodos para hacer algo de init? ¿cosas?

+0

Parece que solo tiene que anular el "inicializador designado".La única forma de descubrir qué método de init * es esto es a través de la documentación. – Nestor

22

Si está utilizando un Storyboard, se llamará a initWithCoder:. documento de referencia dice:

Si su aplicación utiliza un guión gráfico para definir un controlador de vista y su vistas asociadas, su aplicación no inicializa objetos de esa clase directamente. En su lugar, los controladores de vista son instanciados por el storyboard , ya sea automáticamente por iOS cuando se desencadena un segue o por mediante programación cuando su aplicación llama al método instanciaiateViewControllerWithIdentifier: del objeto del guión gráfico. Al instanciar un controlador de vista desde un guión gráfico, iOS inicializa el nuevo controlador de vista llamando a su método initWithCoder: en su lugar. iOS establece automáticamente la propiedad nibName en un archivo nib almacenado dentro de el guión gráfico.

initWithCoder: El método no forma parte de la plantilla predeterminada de un archivo .m, así que hay que añadir a sí mismo en su UIViewController subclase:

- (id)initWithCoder:(NSCoder *)aDecoder { 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 
     // Custom initialization 
     NSLog(@"Was called..."); 
    } 

    return self; 
} 

No hay necesidad de eliminar de su initWithNibName:bundle: código, pero no se llamará de todos modos.

+0

¿Podrías dar más detalles sobre esto? Estoy usando un viewController de la subclase MyController al que he configurado el viewcontroller que hice en el guión gráfico. Sin embargo, en mi archivo .m, solo veo un método initWithNibName y ningún método initWithCoder. ¿Se supone que debo eliminar initWithNibName y poner initWithCoder o estoy haciendo algo diferente? – snapfish

+0

No es necesario eliminar initWithNibName. Simplemente agregue initWithCoder (este método no está en la plantilla predeterminada para un archivo .m). Cambié mi respuesta para denotar esto. – reinaldoluckman

+1

Gracias por aceptar mi edición, ni idea de por qué fue rechazada o lo que piensan que será sin el [superinicio] Grrr. Saludos :) –

Cuestiones relacionadas