J'ai du mal à trouver une bonne solution à ce problème. Dans la -viewWillDisappear:
méthode d' un contrôleur de vue , je dois trouver un moyen de déterminer si c'est parce qu'un contrôleur de vue est poussé sur la pile du contrôleur de navigation, ou si c'est parce que le contrôleur de vue disparaît parce qu'il a été sauté.
En ce moment, je mets des drapeaux comme isShowingChildViewController
mais ça devient assez compliqué. La seule façon dont je pense que je peux le détecter est dans la -dealloc
méthode.
ios
iphone
cocoa-touch
uiviewcontroller
uikit
Michael Waterfall
la source
la source
viewWillAppear
il semblerait que, que le contrôleur de vue soit révélé en poussant ou en sautant quelque chose au-dessus, le tableau viewControllers est le même dans les deux sens! Des idées?viewDidLoad
car il n'est appelé qu'une seule fois! Hmm, délicat!![viewControllers containsObject:self]
place[viewControllers indexOfObject:self] == NSNotFound
? Choix de style?-isMovingFromParentViewController
méthode mentionnée ci-dessous vous permet de tester si la vue est affichée explicitement.Je pense que le moyen le plus simple est:
Rapide:
la source
À partir de la documentation Apple dans UIViewController.h:
Alors oui, la seule façon documentée de le faire est la suivante:
Version Swift 3:
la source
Si vous voulez juste savoir si votre opinion est s'éclaté, je viens de découvrir que
self.navigationController
estnil
enviewDidDisappear
, quand il est retiré de la pile de contrôleurs. C'est donc un test alternatif simple.(Je découvre cela après avoir essayé toutes sortes d'autres contorsions. Je suis surpris qu'il n'y ait pas de protocole de contrôleur de navigation pour enregistrer un contrôleur de vue pour être notifié sur les pops. Vous ne pouvez pas utiliser
UINavigationControllerDelegate
car cela fonctionne réellement.)la source
Swift 4
la source
Dans Swift:
la source
Je trouve que la documentation d'Apple à ce sujet est difficile à comprendre. Cette extension permet de voir les états à chaque navigation.
la source
Cette question est assez ancienne mais je l'ai vue par accident donc je veux publier les meilleures pratiques (afaik)
tu peux juste faire
la source
Cela s'applique à iOS7 , aucune idée si cela s'applique à d'autres. De ce que je sais, dans
viewDidDisappear
la vue a déjà été sauté. Ce qui signifie que lorsque vous interrogez,self.navigationController.viewControllers
vous obtiendrez un fichiernil
. Donc, vérifiez si c'est nul.TL; DR
la source
Les segues peuvent être un moyen très efficace de gérer ce problème dans iOS 6+. Si vous avez donné un identifiant au segment particulier dans Interface Builder, vous pouvez le vérifier
prepareForSegue
.la source
Merci @Bryan Henry, travaille toujours dans Swift 5
la source
Je suppose que vous voulez dire que votre vue est déplacée vers le bas de la pile du contrôleur de navigation en poussant une nouvelle vue lorsque vous dites poussée sur la pile. Je suggérerais d'utiliser la
viewDidUnload
méthode pour ajouter uneNSLog
instruction pour écrire quelque chose sur la console afin que vous puissiez voir ce qui se passe, vous pouvez ajouter unNSLog
àviewWillDissappeer
.la source
Voici une catégorie pour accomplir la même chose que la réponse de sbrocket:
Entête:
La source:
la source