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)