¿Por qué no se llama a viewWillDisappear o viewDidAppear?

Tengo un UINavigationController con una UITableView como mi menu principal. El usuario hace clic en una celda y se presiona una nueva vista en la stack. En un caso, UITableView otra UITableView que necesita una barra de herramientas. Entonces, en el segundo inicio de tableView, configuré la propiedad self.toolbarItems con los elementos correctos. Pero luego tengo que llamar a [self.navigationController setToolbarHidden:NO animated:YES]; Por lo tanto, tiene sentido llamarlo en el método viewDidAppear o viewWillAppear . Pero lo puse en esos methods y descubro (también a través de NSLog) que nunca se les llama. Lo mismo ocurre con ocultarlo en la vista viewWillDisappear o en la viewWillDisappear viewDidDisappear . ¿Por qué no se llaman estos methods? ¿Dónde debería estar haciendo esto ocultar / mostrar la barra de herramientas?

He notado un comportamiento en el que si un controller principal (como UINavigationController o UITabBarController ) nunca obtuviera la vista viewWill/DidAppear llamada, tampoco lo llamará en los controlleres secundarios. Por lo tanto, asegúrese de que en el código en el que crea el controller primario, llame a viewWillAppear , muéstralo, luego, llame a viewDidAppear . Entonces debería hacer esas llamadas en sus controlleres secundarios según corresponda.

Compruebe dos veces que el controller principal está teniendo esos methods llamados, y llámelos usted mismo si no lo están.

Sí, es verdad

Puede hacer esto escribiendo primero este código en

 - (void)viewDidLoad { self.navigationController.delegate = self; } 

Y luego escribe el código que deseas escribir en la vista.

 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if ([viewController isKindOfClass:[self class]]) { //write your code here } } 

Si bien resolvió su problema, en caso de que alguien venga en el futuro, otro problema podría haber sido que olvidó el argumento animado para cualquiera de los dos methods, es decir, el formatting del método debe parecerse a:

 - (void) viewWillAppear:(BOOL)animated 

Noté el mismo problema en iOS7. Cuando estoy usando la barra de tabs (2 botones A, B) y el controller de navigation.

A tiene dos vistas. Uno con vista de tabla y el segundo muestra datos según la selección de la vista de tabla.

B tiene es la única vista.

Botón que se refiere a otra vista separada D, colocada en ambas vistas de barra de tabs (A y B) y en ambas vistas de A.

El problema surge cuando viewWillAppear clic en el button del elemento de la pestaña B, viewWillAppear y viewDidLoad no se llama.

Así que resolví este problema por presentModalViewController:animated: y para volver usé dismissModalViewControllerAnimated: justo cuando voy a ver D desde el elemento de la pestaña B.