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?
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.
Si vous utilisez la navigation, vous pouvez utiliser le premier .__ ou les présentations modales, le second:
self.navigationController?.popToRootViewController(animated: true)
self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
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)
}
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)
func dismiss_all(view: UIView){
view.window!.rootViewController?.dismiss(animated: true, completion: nil)
}
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)
}
}
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.
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.