Nun gehen wir zurück zum Storyboard, wählen ViewControllerC und ziehen vom View-Controller zum Exit-Proxy.
In dem Popup wählen wir unsere Abspulmethode aus.
Schließlich geben wir unserer Abwicklungssegue einen Bezeichner.
Jetzt müssen wir nur noch die Abwicklungssegue auslösen, wenn unsere Taste gedrückt wird.
@IBAction func backToATapped(_ sender: Any) {
performSegue(withIdentifier: "unwindToA", sender: self)
}
Wir sind fertig! 🥂
Ein paar technische Details
Bevor ich diesen Artikel abschließe, möchte ich einen Blick darauf werfen, was die Laufzeit unter der Haube macht.
Das Auffinden des Ziels ist im Grunde ein Spaziergang durch die View-Controller-Hierarchie. Der Parent oder PresentingViewController des aktuellen Viewcontrollers wird der nächste sein.
Bei jedem Halt muss die Laufzeit auch prüfen, ob der Viewcontroller Kinder hat, weil die Abwicklungsmethode in einem von ihnen enthalten sein könnte. Dies geschieht durch den Aufruf der Methode allowedChildrenForUnwinding(from:), die ein Array von UIViewControllern zurückgibt, die die Kinder des View-Controllers sind.
Wir wollen jedoch nicht den Zweig prüfen, der den Quell-View-Controller enthält, da wir gerade von dort kommen. Das wird durch den Aufruf der Methode childContaining(_:) vermieden, die den untergeordneten Viewcontroller zurückgibt, der die Quelle der Abspulsequenz enthält. Dieser wird aus dem Array entfernt.
Wenn das zurückgegebene Array irgendwelche Childs enthält, wird der obige Prozess auch für diese durchgeführt. Er endet, wenn das Ziel gefunden wurde.
Ist das zurückgegebene Array leer, wird die Methode canPerformUnwindSegueAction(_:from:sender:) aufgerufen, die prüft, ob der View Controller die unwind-Methode enthält.
Ist dies der Fall, haben wir unser Ziel erreicht und der Prozess ist beendet. Ist dies nicht der Fall, gehen wir in der View-Controller-Hierarchie einen Schritt nach oben und führen die gleichen Schritte durch.
Abschluss
Ich hoffe, dass Ihnen dieses kurze Tutorial über Abspulsequenzen gefallen hat und danke, dass Sie sich die Zeit genommen haben, es zu lesen.