Delegieren vs Unwind Segue für die Übergabe von Daten an Übergeordnete Szene
Seit iOS 6, entspannen Sie leitet über zur Verfügung gestanden haben, um zu navigieren, die Szene-Hierarchie. Ich bin versucht, zu entscheiden, Reiniger/besser/bevorzugt/mehr wartbar-Methode für die übergabe von Daten zu einem übergeordneten view-controller. Es gibt einige Fragen, dass diese aus technischer Sicht (z.B. "wenn ich eine Entspannung brauche ich noch ein delegieren"), aber ich kann Sie nicht finden viel, die Adressen der Fragen der vor - /Nachteile.
Option 1: verwenden Sie einen Delegaten sind.
- Getan, indem in der übergeordneten Ansicht-controller als Delegierter die Einhaltung eines Protokolls.
- Kind ruft das Protokoll-Methode, um die Daten zurückzugeben.
- Wenn die Daten die Validierung erforderlich ist, durch die Eltern, Rückgabewert/dict benötigt, um Kind zu behandeln Fehler.
- Overhead: Protokoll-definition und eine Methode in der übergeordneten (für Daten-Validierung und-Erhalt).
Option 2: verwenden Sie ein unwind segue
- Erfolgt durch aufrufen der unwind segue vom Kind.
- Kind fügt eine überleitung auf Ihre Szene, indem eine Taste oder das storyboard selbst zu
Exit
zu benennen und die segue so kann es mitperformSegueWithIdentifier:sender
- Übergeordneten implementiert
returnFromSegueName
(Benutzer namens-Methode verknüpft mit der segue) zu greifen, die Daten vom Kind. - Daten-Validierung kann allerdings nur umgesetzt werden, indem auch die Umsetzung
canPerformUnwindSegueAction:fromViewController:withSender
- Daten-Validierung scheitern, wird eine andere Eigenschaft für das Kind ist diese Methode akzeptiert nur einen BOOL-Wert zurückgeben.
- Kind fügt eine überleitung auf Ihre Szene, indem eine Taste oder das storyboard selbst zu
- Aufwand: Zwei Methoden, eine zusätzliche Eigenschaft, plus Storyboard-Spielereien.
Insgesamt Delegierten das Gefühl, wie die cleaner Weg zu gehen, aber vielleicht auch antiquiert. Bin ich falsch zu sein gelehnt in diese Richtung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich merke jetzt, dass dies nicht wirklich eine Frage beantwortbar, andere als zu sagen, dass weder der Ansatz ist falsch - beide haben Ihre vor-und Nachteile. Nachdem Sie angegangen wird, sowohl für eine Woche und mehr Lesen zum Thema kann ich zumindest quantifizieren, warum möchten Sie vielleicht, um entweder ein unwind segue oder die Delegierten für die Zusammenarbeit zwischen den view-Controllern.
Kupplung
Beide Modelle sind etwa gleich (lose) gekoppelt. Unter der Haube, unwind segue ist nur ein Delegierter wo iOS getan hat, die Arbeit der Verkabelung für Sie. Für die Delegierten, die Eltern kennt, und entspricht der child-Protokoll. Zum entspannen leitet über, der Elternteil muss so verdrahtet werden, dass das Kind auf dem storyboard für entspannen und muss, um zu wissen, die Eigenschaften des Kindes zu extrahieren, die Daten zurückgeben. Allerdings, wenn Sie neu an die Delegierten und wollen einfach nur einige Daten aus einer untergeordneten Ansicht, entspannen Sie leitet über wahrscheinlich weniger einschüchternd als die Verwendung von Protokollen mit den Delegierten.
Flexibilität
Entspannen leitet über sind nur eine gute Wahl, wenn der alleinige Zweck die Kind-an-Eltern-Interaktion ist für die Rückgabe von Daten. Es scheint nicht ein Weg, um abzubrechen unwind segue-in-progress. Also, wenn die Eltern zu tun hat, alle-Daten-Validierung, oder wenn das Kind mehr braucht als eine Interaktion mit dem Elternteil, der einzige Weg, dies zu tun ist ein Delegierter, in denen mehrere Methoden aufgerufen werden können, zurück zu den Eltern.
Wartbarkeit
Wenn der Typ oder die anderen Aspekte der Daten, die zurückgegeben änderungen, wird es einfacher zu aktualisieren, das unwind segue als alles, was Sie tun müssen, ist aktualisieren Sie den code in Ihrem unwind segue Blick auf die neuen Eigenschaften. Für das Protokoll/delegate-Ansatz, werden Sie das update-Protokoll in das Kind und die Umsetzung in die Muttergesellschaft. Jedoch, die Einfachheit der unwind segue kommt bei den Kosten, können Sie leicht übersehen Plätze in der Eltern-Ansicht-Controller, die aktualisiert werden müssen, weil Sie nicht die compiler-Prüfung Ihres Auftrags (das Protokoll).
Der Gewinner
Gibt es nicht. Welchen Weg Sie gehen, hängt davon ab, Ihre Daten benötigt, comfort-level Protokolle (sehen Sie eher einschüchternd auf den ersten Blick, als Sie sollten), die Komplexität Ihrer Anwendung, - und langfristigen Pflegebedarf.
Für meine Zwecke, ich aufgewickelt mit Delegierten, weil mein Kind war mehr als ein Ruf zurück zu den Eltern in einigen Fällen. Aber in ein paar Fällen, wo ich hatte viele Stücke von Daten zu pass zurück, ich nahm was ich gelernt habe aus der unwind segue und einfach verwendet Eigenschaften im Kind von dem die Eltern könnten extrahieren Sie die benötigten Informationen. Ich habe auch dies als ein bequemer Weg für die Eltern zu bieten Fehlerinformationen für das Kind. Ich glaube nicht, mix und match entspannen Sie leitet über mit den Delegierten das Programm für Konsistenz mit einem Programmier-partner, aber es gibt keinen Grund, Sie nicht machen konnte, wenn Sie wollte.
War ich sehr skeptisch, storyboards, aber ich beschloss, Tauchen Sie ein und verwenden Sie Sie an einem neuen Projekt. Ich war erstaunt über die Leichtigkeit, mit der Sie kommunizieren kann zwischen zwei view-Controllern. Wenn Sie führen Sie eine performSegueWithIdentifier erhalten Sie ein handle zu dem neuen ViewController. Sie können alle sichtbaren Eigenschaften, die Sie wollen, dass neue viewController sehr sauber und schön.
Hier ist ein Beispiel:
Es ist sehr schön und ordentlich. Kein spezielles Protokoll, das Sie brauchen, um zu verfolgen oder zu pflegen.
Dann zurückkommt (ich habe eine IBAction verbunden, um eine Schaltfläche in meiner detail-Ansicht) kannst Du mal wieder eine schöne, saubere Referenz zu der viewController, zu denen Sie zurückgekehrt sind, und danach handeln, dass viewController.
Auch der Wechsel logic control ist nett. Man durchführen kann, Logik-Prüfungen in shouldPerformSegue, die sind Recht praktisch.
Ich habe gesehen, viele junky code mithilfe von Protokollen der "etwas senden zurück zum Anrufer", die sind wirklich arm bei der Kupplung Klassen. Es macht einen drei-Wege-Anordnung-- viewController1 -> Protokoll -- > viewController2, leitet über in der Erwägung, dass eine schöne Anordnung der viewController1->viewController2.
Der Wechsel ist ein schöner Weg, um sauber und eindeutig die Kopplung der beiden Klassen. Würde ich dringend empfehlen es.
returnWithStudent
. Aber wenn Sie benötigen, zu tun, Daten-Validierung...Sie können es nicht gibt (keine Möglichkeit zum Abbrechen). Und man kann es nicht inshouldPerformSegue
, denn das ist im Kindes-controller (ich gehe davon aus, dass der Elternteil zu tun hat, die Validierung des Kindes sollte nicht wissen über das Datenmodell). So Blätter, die Sie mitcanPerformUnwindSegueAction:fromViewController:withSender
es sei denn, ich habe etwas falsch verstanden.canPerformUnwindSegueAction:fromViewController:withSender
. Ich Stimme mit Ihnen, obwohl, wie es scheint, weniger Kupplung zu verwenden, die entspannen.