Dans mon application, j'ai trois contrôleurs de vue de table, puis potentiellement de nombreux UIViewControllers, chacun devant renvoyer au premier contrôleur de vue de table si l'utilisateur appuie à tout moment. Je ne veux pas que l'utilisateur ait à parcourir potentiellement des centaines de pages. C'est ce que je m'amuse à déterminer si l'utilisateur a appuyé sur le bouton retour et que cela fonctionne le message est imprimé

override func viewWillDisappear(_ animated: Bool) {
    if !movingForward {
        print("moving back")
        let startvc = self.storyboard!.instantiateViewController(withIdentifier: "FirstTableViewController")
        _ = self.navigationController!.popToViewController(startvc, animated: true)
    }
}

J'ai cherché et aucune des solutions n'a fonctionné jusqu'à présent.

3
Filipe 21 avril 2017 à 12:35

3 réponses

Meilleure réponse

popToViewController ne fonctionne pas comme vous essayez de passer une nouvelle référence complète de FirstTableViewController au lieu de celle qui se trouve dans la pile de navigation. Vous devez donc parcourir le navigationController?.viewControllers et trouver le FirstTableViewController, puis appeler popToViewController avec cette instance de FirstTableViewController.

for vc in (self.navigationController?.viewControllers ?? []) {
    if vc is FirstTableViewController {
        _ = self.navigationController?.popToViewController(vc, animated: true)
        break
    }
}

Si vous souhaitez passer au Premier écran , vous recherchez probablement popToRootViewController au lieu de popToViewController.

_ = self.navigationController?.popToRootViewController(animated: true)
14
Nirav D 21 avril 2017 à 09:43

Essaye ça :

let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];

                        for aviewcontroller : UIViewController in allViewController
                        {
                            if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)// change with your class
                            {
                             self.navigationController?.popToViewController(aviewcontroller, animated: true)
                            }
                        }
1
KKRocks 21 avril 2017 à 09:41

Si vous êtes dans un rappel, en particulier un rappel réseau asynchrone, vous n'êtes peut-être pas sur le thread principal. Si c'est votre problème, la solution est:

DispatchQueue.main.async {
    self.navigationController?.popToViewController(startvc, animated: true)
}

L'appel système viewWillDisappear() est toujours appelé sur le thread principal.

0
bshirley 5 mars 2019 à 19:14