que life container iphone cocoa-touch uiview uiviewcontroller

iphone - life - UIViewController-viewDidLoad no se llama



viewcontroller swift (9)

Siendo nuevo en Cocoa, tengo algunos problemas con Interface Builder , UIViewController y amigos.

Tengo una subclase UIViewController con una UIView definida en un xib, y con la salida de la vista del controlador conectada a la vista. El "propietario del archivo" de xib se configura como subclase myViewcontroller .

En este caso, el siguiente código para cargar el controlador / vista (desde el controlador de vista principal) no funciona como se esperaba:

if ( self.myViewController == nil ) { self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; } [self.navigationController pushViewController:self.myViewController animated:YES];

En los métodos de MyViewController, he colocado puntos de interrupción y mensajes de registro para ver qué está pasando:

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { NSLog(@"initWithNibName/n"); } return self; } -(void)viewDidLoad { [super viewDidLoad]; NSLog(@"viewDidLoad/n"); }

Resultado Esperado

Se -initWithNibName -viewDidLoad métodos -initWithNibName y -viewDidLoad , y se muestra la vista myViewController.

Resultado observado

Solo se llama a -initWithNibName , la vista no se muestra.

¿Me he perdido algo? ¿Alguien puede recomendar algo para comprobar? (Particularmente en la herramienta de construcción de interfaces maravillosamente opaca).


Es probable que no haya vinculado el supuesto ViewController en main.storyboard desde el Identity Inspector a la class personalizada que creó. Es posible que pueda navegar a ese controlador desde otros controladores de vista a través de viewDidLoad() pero cualquiera de viewDidLoad() , viewWillAppear() etc. no se ejecutará.


Me parece un problema de capitalización. Está haciendo referencia a la clase MyViewController lugar de la propiedad myViewController en la llamada a pushViewController.


Ok, tengo una respuesta parcial, tal vez los gurús puedan explicar algo más. El problema es:

[self.navigationController pushViewController:myViewController animated:YES];

Mirando más de cerca, en este caso self.navigationController es nulo, por lo que el mensaje push no va a ninguna parte.

En su lugar, si envío:

[self.view addSubview:self.myViewController.view];

Luego aparece la vista y se llama -viewDidLoad .

No estoy completamente seguro de por qué self.navigationController no está configurado en esta instancia; lo único que puedo pensar es que self es una subclase de UIViewController lugar de UITableViewController (de donde pushViewController código pushViewController ).

Además, permitir que los mensajes lleguen a cero en silencio parece una mala idea, aunque estas respuestas dicen lo contrario. Véase también mi pregunta here .

Edición final:

Las respuestas en los comentarios a continuación, me he dado cuenta de que la función de visualización que estaba en realidad después (dado que myViewController es modal) es:

[self presentModalViewController:myViewController animated:YES];

Gracias a todos por sus útiles respuestas.


Otra razón, algo obvia en retrospectiva: si viewController.view está configurado en código, entonces el evento viewDidLoad no se activará.


RE: SOLUCIÓN ENCONTRADA !!!!!

De hecho, esa parece ser una solución operativa, sin embargo, el verdadero truco no está en configurar NO. la punta cuando el método de vista se llama por primera vez.

En ese sentido, un mensaje simple de [viewController view] forzaría a la vista a cargarse desde el archivo nib.


Revise su registro de ejecución para los errores. Es casi seguro que el NIB no se está cargando, y debería haber un error en ese sentido. La causa más probable de esto es no poder colocarlo en el paquete. Mire en la fase de compilación "Copiar recursos" y asegúrese de que el XIB se esté copiando. Construya para el simulador, vaya al directorio de compilación y asegúrese de que el NIB esté en el paquete .app.


SOLUCIÓN ENCONTRADA !!!!!

Incluso algo tan inocuo como esto hace que la viewDidLoad método viewDidLoad suceda.

Inserte este derecho después de alloc initWithNibName

viewController.view.hidden = NO; //calls viewDidLoad


Simplemente usar

- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; //Your Code here }

En lugar del método viewDidLoad.


asegúrese de que la salida de la vista en el Propietario del archivo (su subclase viewController) esté conectada a la vista real (es decir, el lienzo 480X320 que ve en la pantalla que usa para construir su IU)