Xcode

Unwind Segues To The Rescue

Von am 17.01.2014

Beschäftigt man sich als iOS Anfänger etwas länger mit dem Storyboard vom Xcode so stößt man schon bald auf einige Fragen. Wer schon einmal versucht hat einen Back Button programmatisch zu erstellen (sprich ohne NavigationController der einem den Button und die Animation abnimmt) musste bereits selbst herausfinden wie er die Animation zurück bewerkstelligt. Eine sehr bequeme Lösung ist hier der Einsatz von sogenannten “Unwind” Segues.

Unwind Segues ermöglichen es zu vorherigen ViewControllern zurückzuwechseln. Ein entscheidender Vorteil ist zudem, dass nicht nur auf den direkten ViewController davor sondern irgendeinen vorherigen zurück gewechselt werden kann. Xcode ermittelt dabei die Animationsart die für das Hinkommen zum Controller verwendet wurde und nimmt davon die umgekehrte Animation. Ich habe für diesen Artikel bereits 4 verschiedene ViewController vorbereitet und sie mit einer modal-Segue miteinander verbunden.

Unwind Segues 1

Einzige Vorraussetzung ist, dass der Ziel-ViewController zu dem man zurück möchte eine spezielle Action definiert welche eine Unwind Segue als Parameter bekommt. Das sieht dann beispielsweise so aus:

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad]
  // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

- (IBAction)unwindToWhiteViewController:(UIStoryboardSegue *)segue {}

@end

Das tolle an dieser Funktion ist, dass sie ähnlich funktioniert wie `prepareForSegue`. Das bedeutet, dass in der Funktion alles ausgeführt wird bevor die eigentliche Segue Animation gestartet wird. Man könnte hier also sehr wohl über die Segue den Source ViewController ermitteln und abfragen ob es überhaupt der erwünschte ist (falls mehrere View Controller zurück zum ersten führen). Weiters hat man hier eine Schnittstelle und kann über den Source ViewController die Properties ermitteln falls Daten übergeben werden sollen.

- (IBAction)unwindToWhiteViewController:(UIStoryboardSegue *)segue {

  UIViewController* sourceViewController = unwindSegue.sourceViewController;

  if ([sourceViewController isKindOfClass:[OrangeViewController class]])
  {
    NSLog(@"I'm coming from Orange!");
  }
  else if ([sourceViewController isKindOfClass:[GreenViewController class]])
  {
    NSLog(@"I'm coming from Green!");
  }

}

Hat man die Funktion bereits implementiert, muss man nur noch den Button auf das Exit Symbol vom Quell ViewController ziehen. In diesem Fall möchten wir vom Grünen ViewController zurück zum Weißen.

Unwind Segues 2

Danach sollte ein kleines Popup erscheinen und die alle definierten Unwind Actions anzeigen. Wenn man alles richtig gemacht hat sollte hier also die Unwind Segue aufscheinen.

Unwind Segues 3

Das wars auch schon! Zusätzlich kann man die Segue auch im Document Outline markieren und ihr im Attributes Inspector einen Identifier geben. Das hat den Vorteil, dass man die Segue danach auch progammatisch triggern kann wenn man möchte.

The comments are closed.