ios - que - ¿Cómo detectar si el controlador de vista se está extrayendo desde el controlador de navegación?
use container view swift 4 (2)
Actualmente necesito implementar algo de código cuando el controlador de vista superior se salga de mi controlador de navegación. ¿Hay alguna forma de detectar cuándo el controlador de vista se extrae de la pila del controlador de navegación?
En la medida de lo posible, quiero viewWillDisappear
usar viewWillDisappear
o viewDidDisappear
porque estoy usando una vista splitview
en mi proyecto, y al seleccionar una fila diferente en la vista maestra también se activarán los métodos viewWillDisappear
/ viewDidDisappear
.
Puede detectar si una vista se isMovingFromParentViewController
mediante la propiedad isMovingFromParentViewController
para un controlador de vista como se muestra a continuación:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
if ([self isMovingFromParentViewController])
{
NSLog(@"View controller was popped");
}
else
{
NSLog(@"New view controller was pushed");
}
}
isMovingFromParentViewController
Devuelve un valor booleano que indica que el controlador de vista está en proceso de ser eliminado de su padre.
Actualización 20150430
Basado en los comentarios de phatmann (primer comentario a continuación), tenía curiosidad por si algo había cambiado desde que respondí esta pregunta hace más de un año. Preparé una aplicación de ejemplo simple y tengo algunos resultados interesantes.
Opción 1, ejemplo
https://github.com/greymouser/TestNVC
No tengo la capacidad de probar fácilmente pre-8.x, así que no estoy seguro de que algo haya cambiado desde entonces. Sin embargo, el comportamiento que describí originalmente todavía sucede. Sin embargo , gracias a armar la aplicación de prueba, noté una rareza que no había hecho antes.
Si solo confío en {will,did}MoveToParentViewController
, noté un didMoveToParentViewController:
llamar al didMoveToParentViewController:
el primer non-rootVC, en el rootVC, con parent! = Nil (lo que implica que se agregó, no se eliminó). No encontré esto en el momento de mi respuesta original, ya que generalmente tengo rootVC''s "permanentes" en mis NVC, y no había implementado las devoluciones de llamada allí. Vea la aplicación de ejemplo con el registro establecido en LOG_WILL_DID_MTPVC
(en ViewController.m). Esta es una instantánea de lo que vi: editado para el espacio:
TestNVC[] -[vc(rootVC) willMoveToParentViewController [entering]
TestNVC[] -[vc(rootVC) didMoveToParentViewController [entering]
TestNVC[] -[vc(1) willMoveToParentViewController [entering]
TestNVC[] -[vc(rootVC) didMoveToParentViewController [entering] # <-- this is odd
TestNVC[] -[vc(1) didMoveToParentViewController [entering]
...
Mi respuesta original sugirió usar {will,did}MoveToParentViewController
solo, ya que era una "ventanilla única" para manejar este comportamiento. Sin embargo, ahora que he visto la llamada falsa al rootVC, sugiero una combinación de {will,did}MoveToParentViewController
así como las devoluciones de llamada estándar UINavigationControllerDelegate
. Para este comportamiento en la aplicación de ejemplo, configure el registro en LOG_WILL_DID_MTPVC_LEAVING_AND_NVC_WILL_DID_SHOW_VC
. Ahora vemos lo siguiente:
TestNVC[] -[nvcD willShowViewController]: rootVC
TestNVC[] -[nvcD didShowViewController]: rootVC
TestNVC[] -[nvcD willShowViewController]: 1
TestNVC[] -[nvcD didShowViewController]: 1
TestNVC[] -[nvcD willShowViewController]: 2
TestNVC[] -[nvcD didShowViewController]: 2
TestNVC[] -[vc(2) willMoveToParentViewController [leaving]
TestNVC[] -[nvcD willShowViewController]: 1
TestNVC[] -[vc(2) didMoveToParentViewController [leaving]
TestNVC[] -[nvcD didShowViewController]: 1
TestNVC[] -[vc(1) willMoveToParentViewController [leaving]
TestNVC[] -[nvcD willShowViewController]: rootVC
TestNVC[] -[vc(1) didMoveToParentViewController [leaving]
TestNVC[] -[nvcD didShowViewController]: rootVC
... y esto tiene mucho más sentido ahora.
opcion 2
Otra opción que no exploré es usar su sub-base NVC, anulando - pushViewController:animated:
and - popViewControllerAnimated:
y aplicando los comportamientos que desee al VC que se está presionando, o el VC que se devolvió del pop. (Asegúrate de recordar llamar super
en tus anulaciones si intentas esto).
Resumen de actualización
Entonces, gracias a phatmann por la oportunidad de reorientar esto. Creo que mi respuesta es más correcta ahora. Sin embargo, no estoy tan seguro de que alguna vez fue "totalmente no veraz". ;-)
ORIGINAL
Si el comportamiento exacto que describió es lo que está buscando, entonces anule lo siguiente en el controlador de su vista secundaria:
- (void)willMoveToParentViewController:(UIViewController *)parent;
- (void)didMoveToParentViewController:(UIViewController *)parent;
willMoveToParentViewController:
se llamará con parent! = nil al ingresar, y parent == nil al salir. didMoveToParentViewController:
siempre tendrá padre! = nil.
A veces, viewDidDisappear
puede tener sentido. Sin embargo, si realmente está buscando push y pop desde el controlador de vista del contenedor principal, esos métodos anteriores son los que usted desea.