Comment correctement ignorer un UINavigationController qui est présenté comme modal?
Dans mon TabBarViewController
j'ai créer un UINavigationController et à le présenter comme un modal.
var navController = UINavigationController()
let messageVC = self.storyboard?.instantiateViewControllerWithIdentifier("MessagesViewController") as! MessagesViewController
self.presentViewController(self.navController, animated: false, completion: nil)
self.navController.pushViewController(messageVC, animated: false)
À l'intérieur de mon MessageViewController
c'est comment je veux le faire disparaître:
func swipedRightAndUserWantsToDismiss(){
if self == self.navigationController?.viewControllers[0] {
self.dismissViewControllerAnimated(true, completion: nil) //doesn't deinit
}else{
self.navigationController?.popViewControllerAnimated(true) //deinits correctly
}
}
deinit{
print("Deinit MessagesViewController")
}
Le problème est que quand j'arrive à la racine de la Vue-Contrôleur et d'essayer de rejeter à la fois l'enfant et le UINavigationController, mon MessagesViewController
deinit n'est pas appelé. Quelque chose de prenant, -- les plus susceptibles UINavigationController
source d'informationauteur TIMEX
Vous devez vous connecter pour publier un commentaire.
Votre contrôleur de hiérarchie ressemble à ceci:
Maintenant, si vous êtes à l'intérieur
MessagesViewController
puis sonnavigationController
est celui qui est présenté et qui est celui que vous devriez être en rejetant mais en l'appelantdismiss
surMessagesViewController
devrait fonctionner aussi.Cependant, le problème est que la destitution de la manette de navigation ne supprimera pas son point de vue contrôleurs. Il semble que vous tenez à votre manette de navigation (puisque vous êtes en les présentant à l'aide de
self.navController
) donc l'état va devenirDe détruire correctement
MessagesViewController
vous aurez soit à se laisser aller de lanavController
ou vous aurez à pop à la racine (donc enleverMessagesViewController
de vue de la hiérarchie).La solution typique serait de ne pas enregistrer une référence à
navController
à tous. Vous pouvez toujours créer un nouveauUINavigationController
lors de la présentation.Une autre solution est d'utiliser un délégué au lieu de rejeter de l'intérieur
MessagesViewController
, laissez appel vers le présentateur, qui ferait appelEssayer cette
Pas besoin d'être membre pour navController. Utilisez le code suivant pour présenter votre MessagesViewController.
Vos rejeter vue contrôleur de code sera
si vous voulez il suffit de présenter un viewcontroller, puis directement, vous pouvez présenter que viewcontroller et pas besoin de prendre une manette de navigation pour le viewcontroller.
Mais quand nous en avons besoin pour naviguer de celui présenté-vue-contrôleur, alors il nous faut prendre un point de vue contrôleur comme une vue de la racine de la manette de navigation. De sorte que nous pouvons naviguer de celui présenté-vue-contrôleur.
et de celui présenté view controller, vous pouvez pousser un autre point de vue contrôleur et aussi de la pop à partir d'un autre point de vue contrôleur.
Et présenté de-vue-contrôleur, ici
messageVC
nous devons le rejeter commequi rejettera
messageVC
avec succès et de revenir à l'origine viewcontroller d'où nous avons présentémessageVC
.C'est le bon débit pour effectuer
presentViewController
avec manette de navigation, afin de poursuivre la navigation entre le point de vue des contrôleurs.Et de plus si vous n'êtes pas sûr que messageVC est présenté ou poussé, alors vous pouvez le vérifier par cette réponse.
Et la swift version pour vérifier qui est
Donc notre dernière action de rejeter, c'est comme
Je vous suggère d'utiliser les autres initialiseur pour votre
UINavigationController
:À dimiss, il suffit de faire
C'est de cette façon que je résolve le problème en Objective C.
Vous pouvez appeler dismissViewControllerAnimated:PAS de sur votre auto.navigationController lui-même.
Objective C
Swift
Dans Swift 3 ce résultat est obtenu avec: