Tengo una situación en mi aplicación donde un controlador de navegación pushViewController:animated:YES
es activado por un usuario. El usuario también puede activar un popViewController:animated:YES
tocando otro control. La intención es que el popViewController
es el deshacer o inverso del pushViewController.
Sin embargo, si el usuario activa el popViewController:animated:YES
mientras la animación pushViewController todavía está sucediendo, Recibo un mensaje registrado en la consola:
2014-08-22 08:26:36.601 MyApp[22380:60b] nested pop animation can result in corrupted navigation bar
2014-08-22 08:26:36.960 MyApp[22380:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
Y, de hecho, la barra de navegación se corrompe: el botón Atrás ya no está visible. Tengo que hacer otra cosa y volver a la página afectada en mi aplicación para que vuelva a funcionar correctamente.
¿Qué puedo hacer para evitar esta condición de carrera? Mi primer pensamiento fue proteger el popViewController
llamar con un cheque para ver si ya se está produciendo una animación de navegación actual, y esperar a que termine (o incluso cancelar la popViewController
llamar por completo). Sin embargo, no he podido encontrar una forma de detectar que una acción ya está ocurriendo.
Respuestas
2 para la respuesta № 1Hay dos soluciones para este problema. Te sugiero que implementes el primero.
1. Evite la interacción del usuario en múltiples controles a la vez, estableciendo un toque exclusivo para ellos.
- Establezca la propiedad ExclusiveTouch en YES para esos controles si comparten superView (vista principal); de lo contrario, deberá establecer esta propiedad YES en sus vistas principales.
2. Implemente el protocolo UINavigationControllerDelegate en esa controladora de vista donde el usuario está tocando múltiples controles a la vez.
– navigationController:willShowViewController:animated:
– navigationController:didShowViewController:animated:
Establezca un indicador cuando se llame al primer método de delegado y reinícielo en el segundo. Use esta bandera en cada operación push / pop.