126 votes

Démission d'un contrôleur de vue présenté

J'ai une question théorique. Je suis en train de lire l'article d'Apple ViewController guide.

Ils ont écrit :

Lorsqu'il s'agit de licencier un contrôleur de vue présenté, la fonction l'approche préférée est de laisser le contrôleur de vue présentateur le congédier le renvoyer. En d'autres termes, dans la mesure du possible, le contrôleur de vue qui a présenté le contrôleur de vue doit également prendre la responsabilité de l'exécution de la tâche. qui a présenté le contrôleur de vues doit également prendre la responsabilité de l'écarter. Bien qu'il existe plusieurs techniques pour notifier au contrôleur de vue qui le présente que le contrôleur de vue qu'il a présenté présenté, la technique préférée est la délégation.

Mais je ne peux pas expliquer, pourquoi je dois créer un protocole dans le VC présenté et ajouter une variable de délégué, créer une méthode de délégué dans le VC présenté pour renvoyer le VC présenté, au lieu d'un simple appel dans a présenté méthode du contrôleur de vue

[self dismissViewControllerAnimated:NO completion:nil] ?

Pourquoi le premier choix est-il meilleur ? Pourquoi Apple le recommande-t-elle ?

3voto

Pranit Points 134

Swift 3.0 //Démontage du contrôleur de vue dans swift

self.navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)

2voto

svena Points 2206

Citation de View Guide de programmation du contrôleur , "Comment les contrôleurs de vue présentent d'autres contrôleurs de vue".

Chaque contrôleur de vue dans une chaîne de contrôleurs de vue présentés dispose de des pointeurs vers les autres objets qui l'entourent dans la chaîne. En d'autres termes, un Autrement dit, un contrôleur de vue présenté qui présente un autre contrôleur de vue a des objets valides à la fois dans son presentingViewController et son presentedViewController. Vous pouvez utiliser ces relations pour pour suivre la chaîne des contrôleurs de vues, si nécessaire. Par exemple, si l'utilisateur annule l'opération en cours, vous pouvez retirer tous les objets de la chaîne en les démontant. la chaîne en rejetant le premier contrôleur de vue présenté. Le renvoi d'un contrôleur de vue entraîne le renvoi non seulement de ce contrôleur de vue mais aussi tous les contrôleurs de vues qu'il a présentés.

D'un côté, cela permet d'avoir un design équilibré, un bon découplage, etc... Mais d'autre part, c'est très pratique, car vous pouvez rapidement revenir à un certain point de la navigation.

Bien que, personnellement, je préférerais utiliser dérouler des séquences plutôt que d'essayer de traverser en sens inverse le présenter les contrôleurs de vue L'arbre, dont Apple parle dans le chapitre d'où provient la citation.

2voto

Un point est qu'il s'agit d'une bonne approche de codage. Elle satisfait à de nombreuses OOP les principes, par exemple, l'ASR, la séparation des préoccupations, etc.

Ainsi, le contrôleur de vue qui présente la vue devrait être celui qui la rejette.

Par exemple, une société immobilière qui donne une maison en location devrait avoir le pouvoir de la reprendre.

1voto

Mayur Points 33

En plus de la réponse de Michael Enriquez, je peux penser à une autre raison pour laquelle cela peut être un bon moyen de se protéger d'un état indéterminé :

Disons que ViewControllerA présente ViewControllerB de façon modale. Mais, comme vous n'avez peut-être pas écrit le code de ViewControllerA, vous n'êtes pas au courant du cycle de vie de ViewControllerA. Il peut être rejeté 5 secondes (disons) après avoir présenté votre contrôleur de vue, ViewControllerB.

Dans ce cas, si vous utilisiez simplement dismissViewController de ViewControllerB pour qu'il se supprime lui-même, vous vous retrouveriez dans un état indéfini - peut-être pas un crash ou un écran noir, mais un état indéfini de votre point de vue.

Si, au contraire, vous utilisiez le modèle de délégué, vous seriez au courant de l'état de ViewControllerB et vous pourriez programmer pour un cas comme celui que j'ai décrit.

1voto

Rishi Chaurasia Points 439

Swift

let rootViewController:UIViewController = (UIApplication.shared.keyWindow?.rootViewController)!

        if (rootViewController.presentedViewController != nil) {
            rootViewController.dismiss(animated: true, completion: {
                //completion block.
            })
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X