web-dev-qa-db-fra.com

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

Je souhaite qu'une 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, présentée de manière modale ou ouverte avec n'importe quelle méthode.

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?

29
Byoth

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)
    }
}

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

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

self.navigationController?.popToRootViewController(animated: true)

J'espère que ça aide.

33
Agent Smith

Si vous utilisez la navigation, vous pouvez utiliser le premier .__ ou les présentations modales, le second:

Pour la navigation

self.navigationController?.popToRootViewController(animated: true)

Pour présenter modalement

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

Demandez simplement à votre rootViewController de rejeter toute ViewController si elle 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)
}
10
Syed Qamar Abbas

bonjour tout le monde ici est 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, puis l'écran de connexion et que vous souhaitez accéder à l'écran de connexion, vous pouvez simplement ajouter shownviewcontroller dans le code ci-dessus.

self.view.window?.rootViewController?.presentedViewController!.dismiss(animated: true, completion: nil)
4
ayush pathak
 func  dismiss_all(view: UIView){
   view.window!.rootViewController?.dismiss(animated: true, completion: nil)

 }
2
Softlabsindia

Utilisez ce code pour supprimer les contrôleurs de vue présentés et passer à la navigation rootviewcontroller Swift 4

// MARK:- Dismiss and Pop ViewControllers
func dismissPopAllViewViewControllers() {
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
        (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
    }
}
1
Faris Muhammed

Dépose tous les contrôleurs de vue de la pile sauf le contrôleur de vue racine et met à jour l'affichage.

func popToRootViewController(animated: Bool)

Mais si vous voulez aller à un contrôleur spécifique, utilisez simplement la fonction ci-dessous. 

func popToViewController(UIViewController, animated: Bool)

Ouvre les contrôleurs de vue jusqu'à ce que le contrôleur de vue spécifié se trouve en haut de la pile de navigation.

1
Shauket Sheikh

Pour obtenir ce que vous voulez, modifiez votre pile de navigation, puis faites popViewController.

let allControllers = NSMutableArray(array: navigationController!.viewControllers)
let vcCount = allControllers.count
for _ in 0 ..< vcCount - 2 {
    allControllers.removeObject(at: 1)
}
// now, allControllers[0] is root VC, allControllers[1] is presently displayed VC. write back to nav stack
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
// then pop root VC
navigationController!.popViewController(animated: true)

Voir this pour savoir comment manipuler davantage la pile de navigation. Si votre VC supérieur est modal, ignorez-le avant le code ci-dessus.

0
beshio