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 réponses
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)
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)
}
}
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.
De nouvelles questions
ios
iOS est le système d'exploitation mobile fonctionnant sur Apple iPhone, iPod touch et iPad. Utilisez cette balise [ios] pour les questions liées à la programmation sur la plate-forme iOS. Utilisez les balises associées [objective-c] et [swift] pour les problèmes spécifiques à ces langages de programmation.