605 Stimmen

Wozu dienen die Unwind Segues und wie verwenden Sie sie?

IOS 6 und Xcode 4.5 haben eine neue Funktion, die als "Unwind Segue" bezeichnet wird:

Abspul-Sequenzen können den Übergang zu bestehenden Instanzen von Szenen in einem Storyboard ermöglichen

Zusätzlich zu diesem kurzen Eintrag in den Versionshinweisen von Xcode 4.5 scheint UIViewController nun ein paar neue Methoden zu haben:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

Wie funktionieren Abspulübergänge und wofür können sie verwendet werden?

1287voto

Imre Kelényi Punkte 22053

Kurz und bündig

Eine Rückspulübergang (manchmal auch als Exit Segue ) kann verwendet werden, um durch Push-, Modal- oder Popover-Segues zurück zu navigieren (als ob Sie das Navigationselement aus der Navigationsleiste herausgezogen, das Popover geschlossen oder den modal präsentierten View-Controller beendet hätten). Darüber hinaus können Sie nicht nur einen, sondern eine Reihe von Push-/Modal-/Popover-Sequenzen abwickeln, z. B. mehrere Schritte in der Navigationshierarchie mit einer einzigen Abwicklungsaktion zurückgehen.

Wenn Sie eine Abwicklungssequenz durchführen, müssen Sie eine Aktion angeben, d. h. eine Aktionsmethode des View-Controllers, zu dem Sie abwickeln möchten.

Objektiv-C:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

Schnell:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

Der Name dieser Aktionsmethode wird verwendet, wenn Sie die Abspulsequenz im Storyboard erstellen. Außerdem wird diese Methode aufgerufen, kurz bevor die Abspulsequenz ausgeführt wird. Sie können den Quell-View-Controller aus dem übergebenen UIStoryboardSegue Parameter, um mit dem View-Controller zu interagieren, der den Segue initiiert hat (z.B. um die Eigenschaftswerte eines modalen View-Controllers zu erhalten). In dieser Hinsicht hat die Methode eine ähnliche Funktion wie die Methode prepareForSegue: Methode der UIViewController .

iOS 8 Update: Die Abspulsequenzen funktionieren auch mit den adaptiven Segues von iOS 8, wie z. B. anzeigen y Detail anzeigen .

Ein Beispiel

Wir haben ein Storyboard mit einem Navigationscontroller und drei untergeordneten Viewcontrollern:

enter image description here

Von der grünen Ansichtssteuerung können Sie zur roten Ansichtssteuerung zurückgehen (navigieren). Von Blau können Sie zu Grün oder zu Rot über Grün zurückspulen. Um das Abwickeln zu ermöglichen, müssen Sie die speziellen Aktionsmethoden zu Red und Green hinzufügen, z. B. hier die Aktionsmethode in Red:

Objektiv-C:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

Schnell:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

Nachdem die Aktionsmethode hinzugefügt wurde, können Sie die Abspulsequenz im Storyboard definieren, indem Sie mit gedrückter Maustaste auf das Symbol Beenden ziehen. Hier wollen wir von Grün zu Rot abwickeln, wenn die Schaltfläche gedrückt wird:

enter image description here

Sie müssen die Aktion auswählen, die in dem View-Controller definiert ist, zu dem Sie abwickeln möchten:

enter image description here

Sie können auch von Blau zu Rot zurückspulen (was im Navigationsstapel "zwei Schritte entfernt" ist). Der Schlüssel liegt in der Auswahl der richtigen Abwicklungsaktion.

Bevor die Abspulsequenz ausgeführt wird, wird die Aktionsmethode aufgerufen. Im Beispiel habe ich eine Abwicklungssequenz zu Rot aus Grün und Blau definiert. Wir können in der Action-Methode über den Parameter UIStoryboardSegue auf die Quelle der Abspulung zugreifen:

Objektiv-C:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

Schnell:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

Das Abspulen funktioniert auch durch eine Kombination aus Push- und Modal-Segmenten. Wenn ich z. B. einen weiteren gelben View-Controller mit einem modalen Segue hinzufüge, könnten wir in einem einzigen Schritt von Gelb zurück nach Rot abwickeln:

enter image description here

Abspulen von Code

Wenn Sie eine Abwicklungssequenz definieren, indem Sie etwas per Control-Dragging auf das Exit-Symbol eines View-Controllers ziehen, erscheint eine neue Segue in der Dokument-Gliederung:

enter image description here

Wenn Sie die Segue auswählen und in den Attributinspektor gehen, sehen Sie die Eigenschaft "Identifier". Verwenden Sie diese, um Ihrem Segue einen eindeutigen Bezeichner zu geben:

enter image description here

Danach kann die Abspulsequenz wie jede andere Sequenz im Code ausgeführt werden:

Objektiv-C:

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

Schnell:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

169voto

Travis M. Punkte 10580

Was die Verwendung von Abspulsequenzen in StoryBoard betrifft...

Schritt 1)

Wechseln Sie zum Code für den View-Controller, den Sie abwickeln zu und fügen Sie dies hinzu:

Objektiv-C

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

Stellen Sie sicher, dass Sie diese Methode auch in Ihrer .h-Datei in Obj-C deklarieren

Schnell

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

Schritt 2)

Gehen Sie im Storyboard zu der Ansicht, aus der Sie abspulen möchten, und ziehen Sie einfach eine Überleitung von Ihrer Schaltfläche oder was auch immer auf das kleine orangefarbene "EXIT"-Symbol oben rechts in Ihrer Quellansicht.

enter image description here

Es sollte nun eine Option zur Verbindung mit "- unwindToViewControllerNameHere" vorhanden sein.

Das war's. Die Überleitung wird abgespult, wenn Sie auf die Schaltfläche tippen.

46voto

Yang Meyer Punkte 5139

Unwind Segues werden verwendet, um zu einem View-Controller "zurückzugehen", von dem aus man über eine Reihe von Segues zum "aktuellen" View-Controller gelangt ist.

Stellen Sie sich vor, Sie haben etwas MyNavController con A als seinen Root-View-Controller. Jetzt verwenden Sie einen Push Segue zu B . Jetzt hat die Navigationssteuerung A und B in ihrem viewControllers Array, und B ist sichtbar. Jetzt präsentieren Sie C modal.

Mit den Abspulsequenzen können Sie nun "zurück" spulen von C a B (d.h. den modal präsentierten View-Controller zu schließen), also den modalen Übergang "rückgängig" zu machen. Sie könnten sogar den ganzen Weg zurück zum Root-View-Controller zurückspulen A und macht damit sowohl die modale Segue als auch die Push-Segue rückgängig.

Die Abspulsequenzen machen es einfach, zurückzuspulen. Zum Beispiel war vor iOS 6 die beste Praxis für die Entlassung präsentiert View-Controller zu den präsentierenden View-Controller als Delegaten des präsentierten View-Controllers festlegen und dann Ihre benutzerdefinierte Delegaten-Methode aufrufen, die dann den präsentiertenViewController entlässt . Klingt umständlich und kompliziert? War es auch. Deshalb sind Abspulsequenzen gut.

37voto

shawkinaw Punkte 3150

Etwas, das ich in den anderen Antworten hier nicht gesehen habe, ist, wie man mit dem Abspulen umgeht, wenn man nicht weiß, woher die ursprüngliche Überleitung stammt, was für mich ein noch wichtigerer Anwendungsfall ist. Zum Beispiel, sagen Sie, Sie haben einen Hilfe-View-Controller ( H ), die Sie modal von zwei verschiedenen View-Controllern aus anzeigen ( A y B ):

A H
B H

Wie richten Sie die Rückspulung Segue, so dass Sie zurück zu den richtigen View-Controller gehen? Die Antwort ist, dass man eine Rückspul-Aktion deklariert in A y B mit demselben Namen , z.B.:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

Auf diese Weise findet die Abspulung den View-Controller ( A o B ) die Überleitung eingeleitet und kehren zu ihr zurück.

Mit anderen Worten: Stellen Sie sich vor, dass die Abspul-Aktion beschreibt, wohin die Überleitung führt. von und nicht, wohin es geht.

24voto

Vinod Joshi Punkte 7388

Swift iOS:

Schritt 1: Definieren Sie diese Methode in Ihrer MASTER-Controller-Ansicht, in der Sie zurückgehen wollen:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

Schritt 2: (StoryBoard) Klicken Sie mit der rechten Maustaste auf die SLAVE/CHILD EXIT-Schaltfläche und wählen Sie "goToSideMenu" als Aktion, um die Schaltfläche zu verbinden, auf die Sie klicken werden, um zur MASTER-Controller-Ansicht zurückzukehren:

enter image description here Schritt 3: Erstellen und Ausführen ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X