Vérifier si un UIViewController est sur le point d'obtenir Sauté par une pile de navigation?
J'ai besoin de savoir si ma vue-contrôleur est sur le point d'obtenir sauté par la valeur liquidative de la pile afin que je puisse effectuer une action.
Je ne peux pas utiliser -viewWillDisappear, parce que ce qui est appelé lorsque la vue-contrôleur est déplacé hors de l'écran, pour une raison QUELCONQUE (comme un nouveau-vue-contrôleur le fait d'être poussé sur le dessus).
J'ai précisément besoin de savoir quand le contrôleur est sur le point d'être sauté lui-même.
Des idées serait génial, merci d'avance.
- Même si cette question est de 6 ans et a répondu, vous n'avez toujours pas lu la deuxième ligne dans la question " d'où je dis "je ne peux pas utiliser
-viewWillDisappear
, parce que ce qui est appelé lorsque la vue-contrôleur est déplacé hors de l'écran, pour une raison QUELCONQUE (comme un nouveau-vue-contrôleur le fait d'être poussé sur le dessus)."
InformationsquelleAutor Jasarien | 2009-03-13
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il y est un message explicite pour cela, mais vous pourriez sous-classe de la UINavigationController et remplacer - popViewControllerAnimated (bien que je n'ai pas essayé cela avant moi).
Sinon, si il n'y a pas d'autres références à la vue-contrôleur, pourriez-vous ajouter à son dealloc?
Remplacer la
viewWillDisappear
méthode dans le VC, puis vérifier leisMovingFromParentViewController
drapeau au sein de la remplacer et de faire de la logique spécifique. Dans mon cas, je me cache les manettes de navigation de la barre d'outils. Qui a toujours besoin de votre présentés VC comprendre qu'il a été poussé si donc il n'est pas parfait.isMovingFromParentController
etisBeingDismissed
à la fois pour la vue actuelle du contrôleur et tous les parents de la vue actuelle du contrôleur.Essayer primordial
willMoveToParentViewController:
(au lieu deviewWillDisappear:
) dans la sous-classe personnalisée deUIViewController
.Heureusement, le temps que les viewWillDisappear méthode est appelée, le viewController a déjà été retiré de la pile, de sorte que nous savons le viewController popping est parce qu'il n'est plus dans les auto.navigationController.viewControllers
Swift 4
Code Original
respondsToSelector
est inutile.popToRootViewControllerAnimated:
est pris en charge par tous les UINavigationController.[self.navigationController.viewControllers containsObject:self]
C'est de travailler pour moi.
Vous pouvez vous rattraper ici.
Ce sera le feu juste avant l'affichage de la nouvelle Vue. Personne ne se déplace encore. Je l'utilise tout le temps pour faire de la magie en face de la stupide NavigationController. Vous pouvez définir les titres et le bouton de titres et n'importe quoi.
[UINavigationController visibleViewController]
est d'ores et déjàYourAboutToAppearController
. Si en effet l'animation a pas encore commencé.J'ai le même problème. J'ai essayé avec viewDisDisappear, mais je n'ai pas la fonction appelée 🙁 (je ne sais pas pourquoi, peut-être parce que tous mes VC est UITableViewController).
La suggestion de Alex fonctionne très bien mais il échoue si votre manette de Navigation est affiché sous l'onglet Plus. Dans ce cas, tous les VCs de votre nav dans les contrôleurs de la navigationController comme UIMoreNavigationController, pas la manette de navigation que vous avez sous-classé, de sorte que vous ne serez pas averti par le nav quand un VC est sur le point de sauté.
Finalement, j'ai résolu le problème avec une catégorie de UINavigationController, juste réécrire - (UIViewController *)popViewControllerAnimated:(BOOL)animé
Il fonctionne bien pour moi 😀
J'ai essayé ceci:
L'idée est que, au popping, le point de vue du contrôleur de navigationController est définie à zéro.
Donc, si la vue était à disparaître, et il a plus de navigationController, j'ai conclu que c'était sauté. (peut ne pas fonctionner dans d'autres scénarios).
Ne peux pas garantir que viewWillDisappear seront appelés à éclater, comme il n'est pas mentionné dans les docs. Je l'ai essayé quand la vue est vue de dessus et de dessous vue de dessus - et il a travaillé dans les deux.
Bonne chance,
Oded.
Vous pouvez utiliser celui-ci:
Sous-classe
UINavigationController
et remplacerpopViewController
:Swift 3
Peut-être que vous pourriez utiliser UINavigationBarDelegate de navigationBar:shouldPopItem mode de protocole de.
Essayez de faire cette vérification dans viewwilldisappear
si ([self.navigationController.viewControllers indexOfObject:auto] == NSNotFound) {
//popping de ce point de vue a eu lieu.
}