Erstellen einer Multiview-Anwendung auf dem iPhone

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?

    
Tommy 05.03.2009, 19:38
quelle

4 Antworten

7

Die kurze Antwort: Sie können wie folgt zu Ihrem Anwendungsdelegierten zurückkehren:

%Vor%

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

%Vor%

Sie können dann Nachrichten nach Herzenslust an sie 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 Praxis 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 Option ist die Übergabe von Zeigern an die Objekte, die die Klasse zur Initialisierungszeit benötigt. Implementieren Sie ein neues initWithSomethingOrOther für Ihre View-Controller-Klassen und übergeben Sie Objekte als Parameter. Speichern Sie diese benötigten Zeiger (vergessen Sie nicht, sie zu behalten) für die spätere Verwendung.

    
Jon Thomason 05.03.2009 20:10
quelle
4

Der saubere Weg, dies zu tun, besteht darin, ein Protokoll für einen Delegaten für den sekundären Controller zu definieren, der die Methoden auflistet, die der primäre Controller bereitstellen muss:

%Vor%

Fügen Sie nun eine Delegate-Eigenschaft zum SecondaryController hinzu:

%Vor%

Im Abschnitt zur Implementierung von SecondaryController, synthetisieren Sie die Eigenschaft delegate. (Do not gibt es im Destruktor frei.) Wenn der SecondaryController mit dem PrimaryController kommunizieren muss, sollte er die entsprechende Methode für den Delegaten aufrufen.

Stellen Sie nun Ihren PrimaryController das SecondaryControllerDelegate-Protokoll bereit:

%Vor%

Implementieren Sie die Delegate-Methoden 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 tanzt? Nun, wenn Sie einen anderen Controller zwischen Primary und Secondary einführen müssen, oder Secondary an anderer Stelle in der App verwenden, oder sogar die Secondary in anderen App verwenden (ich habe einen Controller, der in drei von meine vier Apps), müssen Sie den SecondaryController überhaupt nicht ändern. Sie ändern nur, was auch immer Klasse sein Delegierter sein sollte. Dies ist eine unglaubliche Zeitersparnis auf lange Sicht.

    
Brent Royal-Gordon 06.03.2009 01:24
quelle
0

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

    
Eric Petroelje 05.03.2009 19:52
quelle
0

Verwenden Sie NSNotificationCenter für die entkoppelte Kommunikation zwischen Objekten.

    
Kristopher Johnson 06.03.2009 14:08
quelle

Tags und Links