2009-05-28 4 views
4

Donc, le problème est que lorsque quelqu'un touche le bouton de retour sur le UINavigationControler, je voudrais exécuter du code pour mettre à jour la source de données.UINavigationController interception - popViewControllerAnimated:

Le problème est que je ne peux pas sembler trouver le bon délégué pour le faire. seulement ceux-ci sont disponibles sur le délégué de contrôleur de nav, et je veux la méthode de type «didfinishshowing». Le prochain meilleur endroit que j'ai pensé était le bar de navigation mais quand j'essaye cela.

Mettre fin application en raison de uncaught exception 'NSInternalInconsistencyException', raison: « Impossible de définir manuellement le délégué sur un UINavigationBar géré par un contrôleur

Cela est logique rétrospectivement, comme vous don Je ne veux pas qu'un pirate pirate les composants internes du contrôleur de navigation et l'empêche de fonctionner.

Ce doit être un problème commun, et j'ai manqué quelque chose de simple.

+0

Ce n'est pas une solution, mais j'ai remarqué que si UINavigationController est instancié à partir d'un storyboard, vous n'obtenez pas l'exception NSInternalInconsistencyException. – hyperspasm

+0

Vous pouvez également faire en sorte que UINavigationController ait une sous-classe UINavigationBar personnalisée, par exemple.'[[UINavigationController alloc] initWithNavigationBarClass: [classe MyNavigationBar] toolbarClass: nil]' et ensuite redéfinir '- (UINavigationItem *) popNavigationItemAnimated: (BOOL) animated' dans la sous-classe UINavigationBar. – hyperspasm

Répondre

5

Ajoutez votre code d'actualisation à la méthode animée viewWillAppear: (BOOL) sur le contrôleur de vue qui est sur le point d'être affiché. Dans votre cas, c'est le contrôleur de vue qui est déjà dans la pile de navigation.

+2

Est-ce toujours la seule bonne réponse dans iOS 4.2, mai 2011? C'est tellement horrible, n'est-ce pas? – epologee

10

Juste pour que nous soyons clairs: la vue A est le point de départ. L'utilisateur appuie sur quelque chose et vous faites glisser vers la droite pour voir B. L'utilisateur tape sur le bouton de retour et vous revenez de B à A et vous voulez faire quelque chose à la suite de l'action «retour».

Il y a trois façons de le faire (et non plus vous devez aller près de la NavigationController - ceux-ci appliquent aux viewControllers sous-jacents eux-mêmes):

  • Comme dmercredi suggère passer outre viewWillAppear sur le contrôleur A vue alors quand vous y revenez, il se rafraîchit. Le problème est que viewWillAppear est également appelé quand A est appelé la toute première fois. Vous devrez donc définir une sorte de drapeau pour faire la distinction entre le premier viewWillAppear et les suivants lors du retour de B.

  • Remplacez viewWillDisappear sur le contrôleur B et rafraîchissez-le. Cela ne sera appelé que lorsque B est sur le point de partir. S'il y a quelque chose sur B qui va plus loin d'un niveau ou qui fait apparaître une boîte de dialogue modale au-dessus, viewWillDisappear va s'appeler à nouveau, vous devrez donc faire la distinction entre le départ et le départ. Découper les différentes vues et utiliser le modèle de délégué.

  • View controller A se définit lui-même comme un délégué de B et lorsque B met à jour quelque chose, il appelle la méthode delegate, donc A est averti du changement et peut mettre à jour tout ce dont il a besoin. Vous pouvez appeler la méthode déléguée à chaque fois que l'utilisateur effectue une modification à l'intérieur de B ou remplacer viewWillDisappear et le faire une seule fois à la sortie.

Questions connexes