UINavigationController et viewWillDisappear

J'ai donc un UINavController dans mon application et j'essaie d'exécuter une méthode lorsque l'user appuie sur le button de return. J'ai cherché partout et ne peux find que des morceaux qui n'ont pas vraiment de sens hors context.

Existe-t-il un moyen d'implémenter une sorte de vérification qui se triggers lorsque l'user appuie sur le button de return pour fermer la vue actuelle? (la méthode viewWillDisappear pour la vue qui a été sautée n'est jamais appelée pour une raison quelconque J'ai lu que ce n'est pas le cas sauf si vous transférez cet appel?) Cela semble-t-il correct, et quelqu'un a-t-il des idées ou des suggestions? Merci d'avance.

AFAIK, si vous ajoutez un UINavigationController à un UIView via le code, il n'enverra pas ces messages à ses sous-vues par défaut. Cela ne le fera que si UINavigationController a reçu ces appels lui-même. Peut-être que c'est votre problème (je ne connais pas la configuration de votre vue).

Ainsi, lors de l'ajout de la vue de UINavigationController, assurez-vous de lui envoyer manuellement ces messages.

UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController]; [navigationController viewWillAppear:NO]; [aView addSubview:navigationController.view]; [navigationController viewDidAppear:NO]; 

Au less, c'est ce que j'ai trouvé pendant le développement. Je suis à la search de cela depuis longtime et je ne comprends toujours pas la logique derrière cela.

Jetez un oeil à UINavigationControllerDelegate . Il y a les deux seules methods qui sont appelées quand un UIViewController est poussé dans la stack du controller de navigation. De même, si quelqu'un est poussé alors quelque chose a probablement été simplement sauté. C'est ce que j'ai fait pour appeler viewDidDisappear et viewWillDisappear.

 # pragma mark - UINavigationControllerDelegate Methods - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { static UIViewController *vcPointer = nil; // If the previous view controller is still around then let's send a viewWillDisappear message if (vcPointer != nil) { if ([vcPointer respondsToSelector:@selector(viewWillDisappear:)]) { [vcPointer viewWillDisappear:animated]; } } // Keep track of a pointer to the current viewController vcPointer = viewController; [viewController viewWillAppear:animated]; } 

Ce code garde une reference de pointeur vers le dernier controller de vue qui a été poussé de sorte qu'une fois que nous en poussons un autre, nous pouvons faire apparaître le dernier (s'il existe toujours).

Vous pouvez toujours masquer le button de navigation arrière par défaut et créer le vôtre avec sa propre méthode à appeler lorsqu'il est pressé.

Exécutez le code que vous voulez là puis ouvrez l'affichage.

J'ai utilisé cette solution:

  • Ajouter un button personnalisé sur le côté gauche de la barre de navigation
  • Laissez ce button activer une méthode personnalisée.

Inconvénient de cette solution de contournement: vous allez perdre cette belle flèche en forme de button "return". Cela peut être résolu aussi bien avec une image personnalisée.

Alors voici mon code. Mettez ceci dans votre vueDidLoad:

 // LeftButton in Navigation Bar UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPushed:)]; self.navigationItem.leftBarButtonItem = leftBarButton; [leftBarButton release]; 

Puis ajoutez cette méthode dans le même file .m:

 - (void) backButtonPushed: (id)sender { // do what you want to do } 

ne pas oublier dans le file .h

 - (void) backButtonPushed: (id)sender; 

ViewWillDisappear & viewDidDisappear est appelée lorsqu'un controller est déclenché ou rejeté. La fonction est appelée sur le controller de vue frontale et non sur UINavigationController elle-même. Avez-vous éventuellement sous-class et oublier d'appeler le super sur quelque chose?