2009-08-05 6 views
0

J'ai donc un UINavigationController qui, évidemment, contient tous mes ViewControllers.Accès aux autres vues de la pile de navigation

J'en ai trois.

Racine-> View2-> View3.

Alors je me demandais est possible ... suite

Quand je suis « dans » View3 (et une instance de Racine et View2 sont assis sur la pile de navigation) est-il possible pour moi d'appeler tout de View2 ou les méthodes de la vue Root/leur envoyer des messages?

Si tel est le cas, comment s'y prend-on? Je posterai un exemple de code si nécessaire.

Merci,

Jon

Répondre

4

En supposant que vous êtes dans l'un des contrôleurs vue, vous pouvez faire quelque chose comme ceci:

UIView* view2 = [self.navigationController.viewControllers objectAtIndex:1]; 
UIView* rootView = [self.navigationController.viewControllers objectAtIndex:0]; 

Maintenant, vous pouvez les envoyer tout les messages que vous voulez.

2

NSNotification fonctionne très bien pour les objets que vous voulez avoir couplés de façon lâche. Dans un contexte Cocoa/iPhone, cela signifie qu'il n'y a pas de références entre eux, surtout.

Dans le contrôleur qui peut recevoir le message:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(doTheThing:) name: @"MessageBetweenControllers" object: nil]; 

Dans le contrôleur qui doit envoyer le message:

NSDictionary *dict = [NSDictionary dictionaryWithObject: <some object> forKey: @"key"]; 
[[NSNotificationCenter defaultCenter] postNotificationName: @"MessageBetweenControllers" object: self userInfo: dict]; 

L'exemple ci-dessus est juste un modèle (par exemple, le NSDictionary bit est optionnel), mais il montre le mécanisme. Lisez la documentation sur NSNotification et NSNotificationCenter pour obtenir les détails.

Ceci n'est pas purement théorique. C'est la méthode principale que j'utilise pour la communication inter-objets dans mes trois applications publiées et ma nouvelle. Les frais généraux pour les notifications en minuscule. Deux getchas: Assurez-vous de ne jamais ajouter une fois Observer par message - le NSNotificationCenter ne supprime pas les doublons; Si vous insérez le même observateur deux fois, il recevra le message deux fois. Aussi, assurez-vous de faire removeObserver dans votre méthode dealloc (encore une fois, voir docs.)

+0

De même, n'oubliez pas que les messages sont reçus sur le même thread qui les a expédiés et que le thread de répartition va bloquer jusqu'à la méthode reçue. le message retourne. –

+0

Bons points. J'utilise généralement des notifications pour définir des indicateurs et des choses comme forcer tableView reloadData qui va revenir rapidement, mais vous voulez vraiment faire attention à ce que vous faites à la réception d'une notification. – Amagrammer

+0

Oui, ça m'a mordu une fois et je ne m'y attendais pas;) –

Questions connexes