Llamar a [UINavigationController pushViewController:animated:] no realiza ninguna operación y desencadenará otro pushViewController.
Actualmente estoy trabajando en la siguiente situación, necesito empujar dos viewController (A y B) en secuencia en poco tiempo.
Esto es lo que hago:
1. Primero llamo a [UINavigationController pushViewController:vcA animated:YES]
2. En [navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated]
, llamo a [UINavigationController pushViewController:vcB animated:YES]
Dado que he anulado algunas funciones en [UINavigationController pushViewController:animated]
, quiero que [UINavigationController pushViewController:animated]
solo se active dos veces, una al empujar vcA
y otra al empujar vcB
.
Sin embargo, la situación actual es que [UINavigationController pushViewController:animated]
se activa tres veces:
1. La primera vez cuando llamamos a [UINavigationController pushViewController:vcA animated:YES]
2. La segunda vez cuando llamamos a [UINavigationController pushViewController:vcB animated:YES]
. Sin embargo, esto es extraño porque en este punto no está haciendo nada. Verifiqué NavigationController.viewControllers
y encontré que vcB
no se había empujado.
3. La tercera vez, [UINavigationController pushViewController:vcB animated:YES]
se activa de nuevo, y es activado por [_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:]
, la traza completa se puede ver aquí.
Entonces, mi pregunta es, ¿de dónde proviene la tercera [UINavigationController pushViewController:vcB animated:YES]
? Estoy seguro de que no he anulado ningún _UIViewControllerTransitionCoordinator
.
davy.ai
Basado en la traza de la pila, la tercera llamada a
[UINavigationController pushViewController:vcB animated:yes]
es desencadenada por_UIViewControllerTransitionCoordinator
. Esto es probablemente debido al hecho de que estás intentando añadirvcB
mientras la pila de navegación todavía está en proceso de animar la transición avcA
.Para asegurarte de que
[UINavigationController pushViewController:vc:animated:]
solo se llama dos veces, podrías intentar lo siguiente:BOOL
para indicar que la primera operación de añadir está completa.navigationController:didShowViewController:animated:
, verifica el indicador antes de intentar añadirvcB
. Si el indicador está establecido, procede con la operación de añadir. Si no, espera a que la animación esté completa y luego añadevcB
.Aquí tienes un ejemplo de código para ilustrar:
De esta manera, puedes asegurarte de que se llama a
[UINavigationController pushViewController:vcB animated:yes]
solo dos veces y que la segunda operación de añadir no se intenta hasta que la primera esté completa.