2009-05-21 18 views
7

actualizaciónviewDidLoad se llama, viewWillAppear no quede llama, vista no aparece en la pantalla

Se ha mencionado que viewWillAppear y viewDidAppear no se les llama por los docs. Sin embargo, no realizo ninguna inicialización dentro de estos métodos y no agrego elementos de UI a la vista.

Solo los estaba usando para colocar puntos de interrupción para intentar depurar esto.

¿Alguna otra idea?


pregunta original

estoy perplejo. Estoy refaccionando algunos códigos y he encontrado algún comportamiento extraño ...

Inicializo viewController A sin una punta y configuré la vista mediante programación.

viewDidLoad en el controlador A recibe una llamada.

Vista interiorDidLoad de viewController A, Inicializo viewController B desde un plumín.

agrego viewControllerB.view como subvista de viewControllerA.view

viewDidLoad del controlador B se llama.


luego se pone raro:

  1. viewWillAppear y viewDidAppear de viewController B Nunca conseguir llama.

  2. viewControllerB.view nunca hace en la pantalla.

  3. No errores.


cosas I verificado:

El nombre de la viewControllerBs plumilla es correcta.

La salida de vista de viewControllerB está conectada a una vista.

viewControllerB y su vista son no-nil.

Y para colmo, todo funciona muy bien en SDK [redactado] beta 5!

¿Alguna idea? Tiene que ser algo tonto ..

+0

¿Esto funciona en sdk3 pero no en los anteriores? – EightyEight

+0

Vea la respuesta de Ramin sobre el misterio de visualización de las apariencias. Está en los documentos, pero no es fácil de encontrar. No estoy seguro de por qué viewControllerB nunca llega a la pantalla. ¿Estás haciendo alguna inicialización importante en viewWillApeear? – amattn

+0

+1 para la lista de cosas marcadas antes de hacer una pregunta aquí – stefanB

Respuesta

0

Para cerrar el asunto:

nunca pude encontrar una solución, pero desde entonces SDK 3.0 es el estándar y el punto se ha convertido en discutible. El código funciona correctamente en las versiones actuales del SDK.

19

Si se añade el controlador de vista a una jerarquía de vistas a través del código, el controlador de vista no conseguirá viewWillAppear (o) viewDidAppear mensajes.Si lo agrega usted mismo, debe enviar el mensaje de control de vista usted mismo.

+2

gracias, eso me ayuda a entender por qué no se está llamando al viewWillAppears/didAppears. Sin embargo, el problema persiste –

1

Trate

-(void) viewDidAppear:(BOOL)animated { 
// whatever 
} 
+0

esto se llama después de que se carga la vista ... –

3

No se olvide de llamar

[super viewWillAppear:animated]; 

Dondequiera que redefinirlo.

La documentación dice:

Si reemplaza este método, debe llamar súper en algún momento de su aplicación.

+0

Estoy usando un guión gráfico con controladores de navegación/viewcontrollers y viewDidAppear no se llamaba ... el motivo era que había comentado [super viewDidAppear: animated] de mi subclase personalizada de la que he heredado uno de mis viewControllers. Doh! No tengo idea de por qué originalmente hice eso (creo que para resolver una condición de carrera). ¡Descomponer esto solucionó el problema! ¡Gracias por el recordatorio! – taber

0

Supongo que su vista no es la vista raíz. Probablemente se está utilizando un UINavigationController así que intenta aplicar este método

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

o éste

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

y añadir en su viewDidLoad

this.navController.delegate = self; 

(no se olvide de añadir el UINavigationControllerDelegate protocolo en su archivo .h