2009-08-05 18 views
0

Ich habe also einen UINavigationController, der offensichtlich alle meine ViewControllers enthält.Zugriff auf andere Ansichten im Navigationsstapel

Ich habe drei.

Root-> View2-> View3.

So ist Ich frage mich folgende möglich ...

Wenn ich ‚in‘ View3 (und eine Instanz von Root und View2 auf dem Navigationsstapel sat) ist es möglich, für mich jeden anrufen von View2 oder den Methoden der Root-Ansicht/Nachrichten senden?

Wenn ja, wie geht man darüber? Ich werde bei Bedarf einen Beispielcode veröffentlichen.

Danke,

Jon

Antwort

4

Vorausgesetzt, dass Sie in einer der View-Controller sind, können Sie etwas tun:

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

Jetzt können Sie sie senden, was Nachrichten, die Sie wollen.

2

NSNotification funktioniert sehr gut für Objekte, die lose gekoppelt werden sollen. In einem Cocoa/iPhone-Kontext bedeutet das meistens keine Referenzen zwischen ihnen.

In der Steuerung, die die Nachricht empfangen:

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

In der Steuerung, die die Nachricht senden muss:

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

Das obige Beispiel ist nur eine Vorlage (zB die NSDictionary Bit ist optional), aber es zeigt den Mechanismus. Lesen Sie die Dokumentation zu NSNotification und NSNotificationCenter, um die Details zu erhalten.

Dies ist nicht rein theoretisch. Es ist die primäre Methode, die ich für die Kommunikation zwischen Objekten in meinen drei veröffentlichten Apps und auch meiner neuen verwende. Der Overhead für die Benachrichtigungen in winzigen.

Zwei Fehler: Stellen Sie sicher, dass SieObserver nur einmal pro Nachricht hinzufügen - das NSNotificationCenter löscht keine Duplikate; Wenn Sie denselben Beobachter zweimal einfügen, wird die Nachricht zweimal empfangen. Stellen Sie außerdem sicher, dass Sie removeObserver in Ihrer Dealloc-Methode (wieder, siehe Dokumente).

+0

Vergessen Sie auch nicht, dass Nachrichten auf dem gleichen Thread erhalten, die sie versandt und dass der Dispatch Thread blockiert, bis die Methode empfangen die Nachricht zurück. –

+0

Gute Punkte. Ich benutze normalerweise Benachrichtigungen für das Setzen von Flags und Dinge wie erzwingen TableView ReloadData, die schnell zurückkehren, aber Sie sollten auf jeden Fall vorsichtig sein, was Sie auf der Empfängerseite einer Benachrichtigung tun. – Amagrammer

+0

Ja, das hat mich wirklich einmal gebissen und ich habe es nicht erwartet;) –

Verwandte Themen