Estoy luchando por encontrar una buena solución a este problema. En el -viewWillDisappear:método de un controlador de vista , necesito encontrar una manera de determinar si se debe a que un controlador de vista está siendo empujado a la pila del controlador de navegación, o si es porque el controlador de vista está desapareciendo porque se ha abierto.
En este momento estoy configurando banderas como, isShowingChildViewControllerpero se está volviendo bastante complicado. La única forma en que creo que puedo detectarlo es en el -deallocmétodo.
fuente

viewWillAppearparece que si el controlador de vista se revela al presionarlo o si se abre algo por encima, ¡la matriz viewControllers es la misma en ambos sentidos! ¿Algunas ideas?viewDidLoadya que solo se llama una vez. ¡Mmm, complicado!![viewControllers containsObject:self]en lugar de[viewControllers indexOfObject:self] == NSNotFound? Elección de estilo?-isMovingFromParentViewControllermétodo mencionado a continuación le permite probar si la vista se muestra explícitamente.Creo que la forma más fácil es:
Rápido:
fuente
De la documentación de Apple en UIViewController.h:
Entonces, sí, la única forma documentada de hacer esto es la siguiente:
Versión Swift 3:
fuente
Si solo quiere saber si su vista está apareciendo, acabo de descubrir que
self.navigationControllerestánildentroviewDidDisappear, cuando se elimina de la pila de controladores. Entonces esa es una prueba alternativa simple.(Esto lo descubro después de probar todo tipo de otras contorsiones. Me sorprende que no haya un protocolo de controlador de navegación para registrar un controlador de vista para que se le notifique en los pops. No se puede usar
UINavigationControllerDelegateporque realmente hace un trabajo de visualización real).fuente
Swift 4
fuente
En Swift:
fuente
Encuentro que la documentación de Apple sobre esto es difícil de entender. Esta extensión ayuda a ver los estados en cada navegación.
fuente
Esta pregunta es bastante antigua, pero la vi por accidente, así que quiero publicar las mejores prácticas (afaik)
solo puedes hacer
fuente
Esto se aplica a iOS7 , no tengo idea si se aplica a otros. Por lo que sé, en
viewDidDisappearla vista ya se ha reventado. Lo que significa que cuando consultaself.navigationController.viewControllersobtendrá unnil. Así que solo verifica si eso es nulo.TL; DR
fuente
Los segmentos pueden ser una forma muy efectiva de manejar este problema en iOS 6+. Si le ha dado al segmento particular un identificador en Interface Builder, puede verificarlo
prepareForSegue.fuente
Gracias @Bryan Henry, todavía trabaja en Swift 5
fuente
Supongo que quiere decir que su vista se está moviendo hacia abajo en la pila del controlador de navegación al presionar una nueva vista cuando dice empujado a la pila. Sugeriría usar el
viewDidUnloadmétodo para agregar unaNSLogdeclaración para escribir algo en la consola para que pueda ver lo que está sucediendo, es posible que desee agregar unNSLogaviewWillDissappeer.fuente
Aquí hay una categoría para lograr lo mismo que la respuesta de sbrocket:
Encabezamiento:
Fuente:
fuente