2017-07-02 4 views
0

Ich habe 2 View-Controller, die ich mit jeder mit einer eigenen Klasse arbeiten. In einer der Klassen gibt es eine Funktion, die unter anderem verschiedene Ansichten (wechselnde Farben von Schaltflächen usw.) in diesem Ansichtscontroller verändert. In der zweiten Ansicht Controller muss ich eine Funktion machen, die ihre eigene Sache innerhalb dieser View-Controller macht sowie die andere Funktion aufrufen, um die Ansichten in der ersten View-Controller anzupassen. Wie richte ich das Protokoll ein und delegiere dies um dies zu erreichen?mit Delegaten in Xcode, um Funktionen auszuführen

Antwort

1

Ich denke, das ist keine sehr gute Architektur. Warum einen View Controller ändern, der nicht einmal sichtbar ist?

Denken Sie stattdessen daran, was Sie über das MVC-Modell (Model-View-Controller) gelernt haben. Sie müssen den Zustand eines View-Controllers in ein Modell abstrahieren, und jeder View-Controller ist selbst dafür verantwortlich, diese Daten auf seine eigene Weise anzuzeigen.

Nehmen wir zum Beispiel an, Sie möchten einen "Status" anzeigen, und wenn es "kritisch" ist, sollte die Farbe in einem Controller rot sein, der andere Controller sollte nur das Wort "kritisch" anzeigen. Beide Controller können diesen Status ändern. In diesem Fall benötigen Sie eine Variable, die den Status enthält, und beide Controller können darauf zugreifen und sie ändern.

(. Sie können mit einer globalen Variablen starten, aber nicht bekommen, in die Gewohnheit Globals verwenden Später können Sie erforschen, wie zB ein Singleton-Muster zu verwenden.)

+0

, da die Funktion in der zweiten View-Controller ein „log-out“ ist, und es muss aktiv Dinge in der App schließen – Sudacris

+0

Hier ist eine gute Übersicht eine einfache Singleton zu schaffen Klasse. https://krakendev.io/blog/the-right-way-to-write-a-singleton – Adrian

-1

Wenn ich Sie richtig verstehe: Sie haben VC1 (View Controller 1), der VC2 darstellt. Wenn VC2 aktiv ist, kann es in einem Zustand sein (oder auf eine Interaktion reagieren), dass es eine Funktion innerhalb von VC1 ausführen muss.

{Beispiel davon ausgehen, dass keine Informationen zurückgesendet werden müssen. Wenn Informationen dann benötigt wird, ändern changedStateFrom Funktion

protocol ChangeStateDelegate { 
    func changedStateFrom(_ viewController: UIViewController) 
} 

class VC1: UIViewController, ChangedStateDelegate { 
    // Here is where you present VC2 
    let vc = VC2() 
    let vc.delegate = self 

    // ChangedStateDelegate 
    func changedStateFrom(_ viewController: UIViewController){ 
     // call whatever function in VC1 you need 
    } 
} 

class VC2: UIViewController { 
    var delegate: ChangedStateDelegate? 

    func foo(){ 
     // Where ever VC2 reacts to a state change and needs to inform VC1, execute this 
     self.delegate?.changedStateFrom(self) 
    } 
} 
Verwandte Themen