web-dev-qa-db-fra.com

iOS - pushViewController vs presentModalViewController différence

Quelle est la différence entre l'appel presentModalViewController et pushViewController, quand:

  • l'animation est définie sur NON (même si c'est un style d'animation modifiable).
  • un contrôleur de navigation est défini lors de la présentation de la vue modale, de sorte qu'il peut également être navigable, avec une pile d'appels, ....

Est-ce juste pour pouvoir revenir de la première vue poussée? Woooaaaaaa ..... 

Je suppose que la différence est ailleurs et plus profonde. Non ?

24
Oliver

La différence la plus importante concerne la sémantique. Les contrôleurs de vue modale indiquent généralement que l'utilisateur doit fournir des informations ou faire quelque chose. Ce lien l'explique plus en profondeur: http://developer.Apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

Voici une autre différence moins abstraite dont ils parlent:

"Lorsque vous présentez un contrôleur de vue modal, le système crée une relation parent-enfant entre le contrôleur de vue ayant effectué la présentation et le contrôleur de vue présenté. Plus précisément, le contrôleur de vue ayant présenté la présentation met à jour sa propriété modalViewController présenter (enfant) contrôleur de vue. De même, le contrôleur de vue présenté met à jour sa propriété parentViewController pour pointer en arrière sur le contrôleur de vue qui l'a présentée. "

Voir aussi ce fil: pourquoi "présent contrôleur de vue modale"?

12
aleph_null

En ignorant les transitions/animations et la manière dont les choses sont structurées dans les coulisses (ce que la réponse d’aleph_null en fournit une bonne discussion), la seule différence qui existe pour l’utilisateur est la possibilité de revenir automatiquement à la vue précédente à l’aide de la barre de navigation. 

Si vous utilisez pushViewController, vous obtiendrez automatiquement un bouton "Précédent" dans la barre de navigation. Si vous utilisez presentModalViewController, ce n'est pas le cas et vous devrez généralement implémenter vos propres contrôles et/ou rappels pour gérer le retrait du contrôleur.

Conceptuellement, le style de présentation modale est généralement utilisé pour les tâches atomiques vers lesquelles vous ne pouvez pas vous échapper (par exemple, vous terminez la tâche ou vous annulez et vous ne pouvez rien faire d'autre dans l'application tant que vous n'avez pas fait l'une ou l'autre).

Si vous vous demandez pourquoi avez la différence en premier lieu, je ne peux pas dire. Personnellement, je pense que les frameworks qui fournissent une API unifiée pour passer d'un contrôleur à un autre (comme cocos2d ou Android) ont beaucoup plus de sens. 

16
aroth

Jetez un coup d'œil dans les viewControllers de l'image  

  • Les 2 contrôleurs ViewControllers (connexion et envoi) en haut à gauche sont déconnectés du tabBarController & NavigationController
  • Le reste des viewControllers sont incorporés dans un NavigationController. Ils appartiennent en quelque sorte au flux naturel de l'application.

Maintenant, vous devez vous demander  

Dois-je toujours afficher la page de connexion + soumission à chaque fois? Ce serait pénible pour l'utilisateur de se connecter à chaque fois, même s'il s'était connecté la dernière fois. Ces 2 écrans vraiment ne correspondent pas au flux naturel des écrans. Alors que faisons-nous? Nous venons de les ajouter modalement en utilisant presentViewController

Cependant, pour le reste de la vue, nous voulons les garder dans la navigation afin que nous puissions facilement aller et retour et utiliser pushViewController.

 enter image description here

Pour plus d'informations, je vous recommande de voir cette vidéo L'image a également été prise à partir de ceci excellente réponse. C'est digne d'un regard.

2
Honey

C'est ce que dit mon expérience. Si vous voulez gérer une hiérarchie de vues, mieux vaut pushViewController dans le contrôleur de navigation. Cela fonctionne comme une pile de contrôleurs de vue dans le contrôleur de navigation. Si toutefois l'exigence consiste simplement à afficher une vue sur l'exécution de certaines actions sur le contrôleur de vue parent, la meilleure façon de la présenter est de la présenter sous forme modale. Si vous avez besoin d'une logique complexe de pop-up, préférez toujours un pushViewController.

1
GhostCode

UINavigationController sont utilisés lorsque vous souhaitez obtenir une sorte de représentation hiérarchique de vos données (c.-à-d. Une exploration en aval). Ils travaillent avec une pile de sous-classes UIViewController. Chaque fois que vous «explorez», vous ajoutez simplement un autre contrôleur de vue à la pile. Ensuite, la logique «arrière» consiste simplement à extraire les contrôleurs de vue d’une pile.

Vous pouvez consulter ce lien: http://www.icodeblog.com/2011/10/11/back-to-basics-an-introduction-to-view-controllers/

0
prohuutuan