2016-03-31 11 views
1

So jetzt habe ich ein rootViewController, die eine UIPageViewController als einzige Subview hat, rootViewController für UIPageViewController im Grunde ein Wrapper-Klasse ist. Jetzt möchte ich Scroll für die UIPageViewController von ViewControllerA deaktivieren (die von rootViewController gehört).Sollte ich eine delegierte Methode oder UINotificationCenter

Im Moment habe ich eine delegierte Methode (erstellt von ViewControllerA) für die rootViewController implementiert, die die UIPageViewController es Scrollen auf Informationen, die von ViewControllerA gegeben abhängig zu stoppen hat erzählt. Aber für die ViewControllerA in der Lage sein, die Delegate-Methode, die von rootViewController implementiert wurde aufrufen, würde die rootViewController eine Instanzvariable von ViewControllerA erfordern.

Wäre dies die beste Praxis? Würde NSNotificationCenter eine bessere Wahl sein? Oder ist keine dieser Methoden die beste Wahl?

+0

Normalerweise wird das Notification Center verwendet, wenn mehr als ein Objekt über das Geschehen informiert werden soll. – Andrea

Antwort

1

Die beste Vorgehensweise wäre eine Delegierten- oder eine Rückruf Eigenschaft zu verwenden:

final class ViewControllerA: UIViewController 
{ 
    var callback: (ViewControllerA ->())? 

    func somethingHappened() 
    { 
     callback?(self) 
    } 
} 

Wenn Sie diesen Stil verwenden, müssen Sie einen Referenzzyklus zu vermeiden:

let viewControllerA = ViewControllerA() 
viewControllerA.callback = { [weak self] _ in ... } 

Wenn Sie bist ein Delegierter unter Verwendung eines Referenzzyklus vermeiden weak var unter Verwendung:

weak var delegate: ViewControllerADelegate? 

Diese Art s sind NSNotificationCenter vorzuziehen, weil sie typsicherer, lesbarer und flexibler sind.

+0

Können Sie einen Beispielcode mithilfe der Callback-Eigenschaft bereitstellen? Ich habe es noch nie zuvor gesehen und es wäre toll, wenn jemand, der es verstanden hat, mir ein Beispiel gegeben hat! – YellowPillow

+0

Ich habe es erweitert - Sie deklarieren einfach eine 'var' mit einem optionalen Funktionstyp und weisen sie dann beim Erstellen des Objekts einem Abschluss zu. Sie können das Objekt übergeben, das den Callback aufruft, wenn Sie möchten (wie es bei Delegate-Methoden der Fall ist). In diesem Fall spielt es keine Rolle. Fügen Sie nach Bedarf weitere Parameter hinzu. –

0

Es gibt viele Möglichkeiten, Ihr Problem zu lösen. Wenn Sie festlegen können, dass Sie Ihrem ViewControllerA eine rootViewController-Variable hinzufügen und diese während der Erstellung von ViewControllerA festlegen können, ist dies der schnellste Weg, um sie aufzurufen. Normalerweise verwende ich das NSNotificationCenter, wenn mehrere Threads beteiligt sind. Wenn also eine asynchrone Task wie HTTP-Aufrufe ausgeführt wird und die Anwendung abhängig vom Ergebnis entsprechend reagieren muss, ist die Verwendung eines NSNotificationCenters eine gute Wahl, da die Nachricht einfach app-weit gesendet und nur hinzugefügt werden muss ein Beobachter abhängig von der Nachricht.

+0

Also denke ich, dass in diesem Fall die Verwendung von NSNotificationCenter etwas zu viel wäre? – YellowPillow

+0

in Ihrem Fall Ich denke, Sie können einfach eine Variable zu Ihrem ViewControllerA hinzufügen, die den Verweis auf Ihren RootViewController enthält. Das wäre der schnellste Weg, da Sie nur zwei Klassen haben. –