tab example ios cocoa-touch uiviewcontroller navigationcontroller

ios - example - tabbarcontroller



Consecuencias de una mala programación: dismissViewController vs popViewController (2)

No estoy seguro de poder explicarlo lo mejor que me gustaría, pero déjame intentarlo.

Estoy trabajando en una aplicación basada en pestañas ahora mismo, y cada pestaña tiene su propio controlador de navegación. Para las características secundarias, tengo un artículo de barbutton en la rama de la barra de navegación a una vista modal (y, en algunos casos, un modal a un nuevo controlador de navegación para controlar el backstack para la ruta de la característica en particular.

Llamaré a despideViewController en la vista raíz de cualquier controlador de navegación que lancé fuera de otro como modal. (Espero que tenga sentido.)

Tal vez esto es mejor:

El controlador de vista de presentación es responsable de descartar el controlador de vista que presentó. Si llama a este método en el controlador de vista presentado, automáticamente reenvía el mensaje al controlador de vista de presentación.

Si presenta varios controladores de vista en sucesión, de este modo, al construir una pila de controladores de vista presentados, al utilizar este método en un controlador de vista inferior en la pila, se descartará su controlador de vista hijo inmediato y todos los controladores de vista por encima de ese niño en la pila. Cuando esto sucede, solo la vista superior se despide de forma animada; cualquier controlador de vista intermedio simplemente se elimina de la pila. La vista de la parte superior se despide usando su estilo de transición modal, que puede diferir de los estilos utilizados por otros controladores de vista inferiores en la pila.

Presione para obtener controladores de vista basados ​​en la navegación y use popViewController cuando sea necesario. Presente modalmente cualquier cosa que se desvíe de la navegación, y utilice un despegueViewController según sea necesario en ese caso.

Entiendo la diferencia entre un dismissViewControllerAnimated:completion: y popViewControllerAnimated: como se describe en Desbordamiento de pila y aquí:

-dismissViewControllerAnimated:completion: método se utiliza para descartar un UIViewController, que se presentó mediante el método: -presentViewController:animated:completion:

-popViewControllerAnimated: método de UINavigationController se utiliza para abrir un controlador mostrado por -pushViewController:animated método -pushViewController:animated de UINavigationController.

Recientemente detecté un error en mi aplicación, cuando estaba usando [self dismissViewControllerAnimated:completion:] para descartar un VC que se presentó con un empuje en una aplicación integrada de navegación. Frito en francés cuando debería haber pizza. No entendí el error porque todo funcionó bien y mi VC fue desasignada como se esperaba.

Mi pregunta: ¿Cuáles son las consecuencias de mezclar estos dos métodos?


-presentViewController:animated:completion: y -pushViewController:animated: significan cosas diferentes. El primero dice "presente este otro controlador de vista para reemplazarse". El último dice "muestra este otro controlador de vista dentro de ti, como parte de la lista que estás controlando".

Entonces, se trata de quién se considera responsable de la pantalla después de la transición. En el primer caso el controlador de navegación cede el control. En este último conserva el control.

La funcionalidad anterior es proporcionada por UIViewController . Este último es específico de UINavigationController .

Debido a que las dos acciones son muy diferentes, las acciones opuestas están separadas. Los controladores de navegación podrían capturar el dismissViewController:... y verificar cómo se presentó el controlador nombrado, bifurcarse en la superclase o en la ventana pop... pero la combinación de tareas no sería atractiva desde el punto de vista del diseño y del mantenimiento.

Dado que el controlador de navegación no promete asignar una cosa a la otra, y UIViewController no promete ningún comportamiento en particular si el controlador que pasa no se ha presentado anteriormente, creo que la respuesta literal a su pregunta es: la consecuencia Mezclar estas dos cosas es un comportamiento indefinido.