2009-03-05 15 views
8

Ich habe eine App mit einem Root-View-Controller, einem primären View-Controller und einem sekundären View-Controller. Ich möchte in der Lage sein, eine Nachricht vom Sekundäransicht-Controller an den Primäransicht-Controller zu senden. Wie kann ich einen Verweis auf das primäre Gerät erhalten, damit ich ihm Nachrichten senden kann? Gibt es eine bessere Möglichkeit, dies zu gestalten?Eine Multiview-Anwendung auf dem iPhone erstellen

Antwort

0

Wenn die Controller von einer NIB geladen werden, können Sie einen Ausgang am sekundären Controller definieren und ihn im Interface Builder mit dem primären Controller verbinden.

7

Die kurze Antwort: Sie können wie folgt auf Ihre Bewerbung Delegierten zurück:

YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

Sie wahrscheinlich bereits einen Zeiger auf Ihre Root-View-Controller in Ihrer Anwendung delegiert Klasse. Und Sie haben wahrscheinlich Zeiger auf Ihre primären und sekundären Ansichts-Controller im Root-Controller-Objekt. So könnten Sie Code wie folgt schreiben:

SecondaryViewController *primary = delegate.rootController.primaryController; 

Sie dann Nachrichten Ihres Herzens, um es zum Inhalt senden. Keine Steckdosen erforderlich; nur Eigenschaften für jeden View-Controller.

Es gibt viele längere Antworten und auch eine Diskussion darüber, warum diese Vorgehensweise möglicherweise fragwürdig ist, da sie potenziell unerwünschte Verknüpfungen zwischen Objekten einführt. In einem "reinen" objektorientierten Design folgen Sie einem sauberen Entwurfsmuster mit klaren Verknüpfungen zwischen Objekten in verschiedenen Richtungen, so dass Sie den Code besser wiederverwenden können.

Eine weitere Möglichkeit besteht darin, Zeiger auf die Objekte zu übergeben, die die Klasse zur Initialisierungszeit benötigt. Implementieren Sie ein neues initWithSomethingOrOther für Ihre View-Controller-Klassen und übergeben Sie Objekte als Parameter. Cache diese Zeiger, die Sie benötigen (vergessen Sie nicht, sie zu behalten) für die spätere Verwendung.

4

Der saubere Weg, es zu tun, ist ein Protokoll für einen Delegierten für den sekundären IDE-Controller zu definieren, welche die Methoden listet es die primäre Controller bereitstellen muss:

@protocol SecondaryControllerDelegate <NSObject> 
- (void)secondaryController:(SecondaryController*)secondaryController 
      frobFooWithBar:(Bar*)myBar; 
- (BOOL)secondaryController:(SecondaryController*)secondaryController 
      shouldTwiddleBaz:(Baz*)currentBaz; 
@end 

Jetzt einen Delegierten-Eigenschaft auf den SecondaryController hinzufügen:

@interface SecondaryController : UIViewController { 
    id <SecondaryControllerDelegate> delegate; 
    ... 
} 

// delegates are one of the few places you don't retain an object 
@property (assign) id <SecondaryControllerDelegate> delegate; 
... 

Im Implementierungsabschnitt des SecondaryControllers die Delegate-Eigenschaft synthetisieren. (Do nicht release es im Destruktor.) Wenn SecondaryController mit dem PrimaryController kommunizieren muss, sollte es die entsprechende Methode für den Delegaten aufrufen.

Jetzt ist Ihre PrimaryController machen das SecondaryControllerDelegate Protokoll implementieren:

@interface PrimaryController : UIViewController <SecondaryControllerDelegate> { 
... 

Umsetzung der Delegatmethoden in PrimaryController.

Schließlich muss sich Ihr PrimaryController selbst als Delegierter des SecondaryControllers festlegen. Wie Sie das tun, hängt davon ab, ob Sie SecondaryController in einer Feder erstellen oder nicht. Wenn Sie dies tun, stellen Sie die Verbindung dorthin her; Wenn nicht, machen Sie es, nachdem Sie den SecondaryController zugewiesen und initiert haben.

Warum machst du dieses Lied und Tanz?Nun, wenn Sie einen anderen Controller zwischen Primary und Secondary einführen müssen, oder Secondary an anderer Stelle in der App verwenden oder Secondary in eine andere App verwenden (ich habe einen Controller, der in drei meiner vier Apps verwendet wird), Sie müssen den SecondaryController überhaupt nicht ändern. Sie ändern nur, was auch immer Klasse sein Delegierter sein sollte. Dies ist eine unglaubliche Zeitersparnis auf lange Sicht.

0

Verwenden Sie NSNotificationCenter für entkoppelte Kommunikation zwischen Objekten.

+0

+1 für NSNotificationCenter. –