2012-06-11 21 views
18

Sé que hay muchas preguntas similares, pero no puedo encontrar una que aborde específicamente esto.¿Por qué es self.navigationController nulo en viewDidLoad?

¿Por qué self.navigationController es nulo cuando se invoca en viewDidLoad, pero se corrige cuando se llama desde afuera viewDidLoad?

Esta es mi salida de NSLog(@"%@",self.navigationController); El primero se llama en viewDidLoad, la segunda agrego un botón a la interfaz con un método que llama NSLog(@"%@",self.navigationController);:

NavApp[31524:11003] (null) 
NavApp[31524:11003] <UINavigationController: 0x6e21190> 

sé que debe haber alguna explicación simple para esto comportamiento, solo tengo curiosidad sobre lo que es. ¡Gracias!

+0

¿Está llamando [super viewDidLoad] primero? – jrturton

+0

Hay una pregunta similar aquí: http://stackoverflow.com/questions/7497183/problem-with-navigationcontroller. La respuesta aceptada es la misma que la de Mike, pero un poco menos detallada. – gtmtg

Respuesta

58

La vista de un controlador de vista se carga cuando accede por primera vez al método/propiedad -view en ese controlador. Después de cargar la vista, se llama al método viewDidLoad. Esto es bastante sencillo. También debe recordar que la vista puede cargarse/descargarse varias veces si se reciben advertencias de memoria mientras la vista está fuera de pantalla.

Por lo tanto, viewDidLoad no significa que su controlador de vista se ha insertado en un controlador de navegación. En el proceso de presionar un controlador de vista en un controlador de navegación, se accederá a él y se cargará su view, pero esto ocurrirá antes de se completa la operación. Por lo tanto, viewDidLoad es claramente llamado antes de que la propiedad navigationController haya sido actualizada.

También debe tener en cuenta que alguna otra parte de su código podría estar accediendo a la vista del controlador de vista incluso antes de empujar el controlador de vista al controlador de navegación.

Entonces viewDidLoad es el lugar equivocado para hacer lo que está haciendo. Probablemente desee utilizar un método como viewDidAppear: para que sepa que la vista del controlador de vista forma parte de la jerarquía de vista cuando se invoca.

+3

Sí, moví mi código a 'viewWillAppear:' y funciona bien. Tenía curiosidad sobre el razonamiento. Tu publicación lo aclaró. Gracias. –

Cuestiones relacionadas