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, isShowingChildViewController
pero se está volviendo bastante complicado. La única forma en que creo que puedo detectarlo es en el -dealloc
método.
fuente
viewWillAppear
parece 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?viewDidLoad
ya que solo se llama una vez. ¡Mmm, complicado!![viewControllers containsObject:self]
en lugar de[viewControllers indexOfObject:self] == NSNotFound
? Elección de estilo?-isMovingFromParentViewController
mé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.navigationController
estánil
dentroviewDidDisappear
, 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
UINavigationControllerDelegate
porque 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
viewDidDisappear
la vista ya se ha reventado. Lo que significa que cuando consultaself.navigationController.viewControllers
obtendrá 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
viewDidUnload
método para agregar unaNSLog
declaración para escribir algo en la consola para que pueda ver lo que está sucediendo, es posible que desee agregar unNSLog
aviewWillDissappeer
.fuente
Aquí hay una categoría para lograr lo mismo que la respuesta de sbrocket:
Encabezamiento:
Fuente:
fuente