ios cocoa-touch uinavigationcontroller pushviewcontroller presentmodalviewcontroller

iOS-pushViewController vs presentModalViewController diferencia



cocoa-touch uinavigationcontroller (5)

Al ignorar las transiciones / animaciones y cómo se estructuran las cosas detrás de la escena (de la cual aleph_null''s alswer proporciona una buena discusión), la única diferencia que enfrenta el usuario es la posibilidad de regresar a la vista anterior automáticamente usando la barra de navegación.

Si utiliza pushViewController , obtendrá automáticamente un botón "Atrás" en la barra de navegación. Si usa presentModalViewController , no lo hace y, en general, tendrá que implementar sus propios controles y / o devoluciones de llamada para controlar el despido del controlador.

Conceptualmente, el estilo de presentación modal se usa generalmente para tareas atómicas de las que no se puede alejar (es decir, completa la tarea o cancela, y no puede hacer nada más dentro de la aplicación hasta que realice una u otra).

Si te estás preguntando por qué tener la diferencia en primer lugar, no puedo decir. Personalmente, creo que los marcos que proporcionan una API unificada para pasar de un controlador a otro (como cocos2d o Android) tienen mucho más sentido.

¿Cuál es la diferencia entre llamar a pushViewController y pushViewController , cuando:

  • la animación se establece en NO (incluso si es así, es solo un estilo de animación que se puede cambiar).
  • se define un controlador de navegación cuando se presenta la vista modal, por lo que también puede ser navegable, con una pila de llamadas, ...

¿Esto es solo para poder regresar desde la primera vista empujada? Woooaaaaaa .....

Supongo que la diferencia está en otra parte y más profunda. No ?


Esto es lo que dice mi experiencia: si desea administrar una jerarquía de vistas, mejor opte por pushViewController en el controlador de navegación. Funciona como una pila de controladores de vista en el controlador de navegación. Sin embargo, si el requisito es simplemente mostrar una vista sobre la ejecución de algunas acciones en el controlador de vista principal, entonces la mejor manera es presentarlo de manera modesta. Si necesita una lógica compleja de inserción de pop, siempre prefiera un pushViewController.


La diferencia más importante es sobre la semántica. Los controladores de vista modales generalmente indican que el usuario tiene que proporcionar alguna información o hacer algo. Este enlace lo explica más a fondo: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

Aquí hay otra diferencia menos abstracta de la que hablan:

"Cuando presenta un controlador de vista modal, el sistema crea una relación padre-hijo entre el controlador de vista que realizó la presentación y el controlador de vista que se presentó. Específicamente, el controlador de vista que realizó la presentación actualiza su propiedad modalViewController para que apunte a su controlador de vista presentado (secundario). De manera similar, el controlador de vista presentado actualiza su propiedad parentViewController para apuntar de nuevo al controlador de vista que lo presentó ".

También vea este hilo: ¿por qué "controlador de vista modal actual"?


UINavigationController se utiliza cuando desea tener algún tipo de representación jerárquica de sus datos (es decir, profundizar). Trabajan usando una pila de subclases UIViewController. Cada vez que “profundiza”, simplemente agrega otro controlador de vista a la pila. Entonces, la lógica de "retroceso" es simplemente una cuestión de quitar los controladores de vista de una pila.

Puede consultar este enlace: http://www.icodeblog.com/2011/10/11/back-to-basics-an-introduction-to-view-controllers/


Echa un vistazo a los viewControllers en la imagen.

  • Los 2 viewControllers superiores (inicio de sesión y envío) en la parte superior izquierda están desconectados de tabBarController y NavigationController
  • El resto de los viewControllers están incrustados en un NavigationController. De alguna manera pertenecen al flujo natural de la aplicación.

Ahora tienes que preguntarte

¿Necesito mostrar siempre la página de inicio de sesión + envío cada vez? Sería un dolor en el cuello para el usuario cada vez que vaya a iniciar sesión, incluso si se conectó la última vez. Estas 2 pantallas realmente no se ajustan al flujo natural de las pantallas. ¿Asi que que hacemos? Solo los agregamos presentViewController usando presentViewController

Sin embargo, para el resto de viewControllers queremos mantenerlos dentro de la navegación 2 para que podamos avanzar y avanzar fácilmente , así que usamos pushViewController

Para más información, te recomiendo que veas este video La imagen también se seleccionó de this gran respuesta. Es digno de un vistazo.