80 votes

Swift - Comment écarter tous les contrôleurs de vue pour revenir à la racine

Je souhaite que mon application puisse accéder à un premier contrôleur de vue à chaque fois que les utilisateurs le souhaitent.

Je souhaite donc créer une fonction pour ignorer tous les contrôleurs de vue, qu’elle soit enfoncée dans les contrôleurs de navigation ou présentée de manière modale ou ouverte, quelle que soit la méthode utilisée.

J'ai essayé de différentes manières, mais je n'ai pas réussi à écarter tous les contrôleurs de vue. Y a-t-il un moyen facile?

98voto

Agent Smith Points 1746

Essaye ça :

 self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)
 

il devrait fermer tous les contrôleurs de vue situés au-dessus du contrôleur de vue racine.

Si cela ne fonctionne pas, vous pouvez le faire manuellement en exécutant une boucle while comme celle-ci.

 func dismissViewControllers() {

    guard let vc = self.presentingViewController else { return }

    while (vc.presentingViewController != nil) {
        vc.dismiss(animated: true, completion: nil)
    }
}
 

Il ferait disparaître tous les viewControllers jusqu'à ce qu'il ait un presentController.

Edit: si vous voulez ignorer / afficher des ViewControllers poussés, vous pouvez les utiliser

 self.navigationController?.popToRootViewController(animated: true)
 

J'espère que ça aide.

42voto

Sandip Gill Points 654

Si vous utilisez Navigation, vous pouvez utiliser le premier ou si vous présentez de manière modale, vous pouvez en second:

Pour la navigation

 self.navigationController?.popToRootViewController(animated: true)
 

Pour présenter modalement

 self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
 

35voto

ayush pathak Points 73

Bonjour à tous, voici la réponse pour Swift-4 .

Pour revenir au contrôleur de vue racine, vous pouvez simplement appeler une ligne de code et votre travail sera terminé.

  self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)
 

Et si vous avez l'écran de démarrage et après que l'écran de connexion et que vous voulez aller à l' écran de connexion , vous pouvez simplement ajouter presentedviewcontroller dans le code ci - dessus.

 self.view.window?.rootViewController?.presentedViewController!.dismiss(animated: true, completion: nil)
 

26voto

Syed Qamar Abbas Points 2243

Demandez simplement à votre rootViewController de rejeter tout ViewController s'il présente.

 if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
   appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
   (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
}
 

0voto

Softlabsindia Points 150
 func  dismiss_all(view: UIView){
   view.window!.rootViewController?.dismiss(animated: true, completion: nil)

 }

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