Pregunta

Tengo un UINavigationController sobre la que empujo una 'pantalla de carga' UIViewController mientras que de forma asíncrona conectarse a un servidor. El empuje está animado implícitamente con ese efecto de deslizamiento. Si se produce un error, mientras que la conexión, I pop el controlador de pantalla de carga (de nuevo animado) y mostrar una alerta al usuario.

Todo es bueno si estallar el controlador de vista después de la animación se ha completado, sin embargo, si la animación aún tiene que completar ocurren cosas extrañas. Normalmente la vista de la pantalla de carga permanece en la pantalla a pesar de que se ha hecho estallar de la pila de controladores de navegación. Estoy bastante seguro de que el problema tiene que ver con la animación está en progreso. Por ejemplo, este fragmento de código artificial deja siempre la opinión de secondController en la pantalla para mí:

[navController pushViewController: secondController animated: YES];
[navController popToRootViewControllerAnimated: YES];
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops");

Mi solución actual es registrar un delegado con el controlador de navegación e implementar el navigationController: didShowViewController: animada: método. Yo entonces sólo pop el controlador de pantalla de carga cuando sé que la primera animación de empuje ha completado. Sin embargo yo preferiría que acaba de terminar la animación temprana.

He intentado llamar removeAllAnimations de todas las capas en el árbol de capas para todas las vistas sub de vista del control de navegación. Si bien este enfoque terminó la animación temprana, todavía deja a menudo la vista de la pantalla de carga todavía en la pantalla después de que se había reventado. Así que, básicamente hay una manera correcta de poner fin a una animación temprana, o debo seguir con mi trabajo alrededor?

¿Fue útil?

Solución

Es difícil saber por qué usted quiere hacer estallar al controlador de vista raíz inmediatamente después de presionarla, pero cuando he tenido que hacer este tipo de cosas, dejar que el controlador de vista siendo empujado a determinar si es necesario hacer estallar o no. Así que en -viewDidLoad de su secondController, determinar si o no su condición para hacer estallar a la vista raíz es cierto. Si es así, entonces pop a partir de ahí llamando

[[self navigationController] popViewControllerAnimated:YES];

Además, no es que esto va a arreglar el problema, pero puede que desee considerar empujando una "pantalla de carga" con -presentModalViewController lugar:

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

y es equivalente pop:

- (void)dismissModalViewControllerAnimated:(BOOL)animated

Otros consejos

, no está comprobado, pero has eliminación de todas las animaciones de la capa de la animación núcleo de vista su visión controladores?

[[[secondController view] layer] removeAllAnimations];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top