webentwicklung-frage-antwort-db.com.de

Zurück zum RootViewController vom Modal View Controller

In der Startansicht - meinem RootViewController - öffne ich nacheinander 2 ViewController, wenn der Benutzer in der Navigationshierarchie voranschreitet:

1) SecondViewController wird durch einen in meinem Storyboard verbundenen Knopf gedrückt

2) ThirdViewController wird modal dargestellt

[self performSegueWithIdentifier:@"NextViewController" sender:nil];

Das Bild ist also: RootViewController -> SecondViewController -> ThirdViewController

Jetzt möchte ich in meinem ThirdViewController eine Schaltfläche haben, um zweimal zu meinem RootViewController zurückzukehren, d. H. Nach Hause zu gehen. Das geht aber nicht:

[self.navigationController popToRootViewControllerAnimated:YES]; 

Nur dieser Typ kehrt einmal zu SecondViewController zurück

[self.navigationController popViewControllerAnimated:YES];

Wie kann ich sowohl modale als auch Push-View-Controller gleichzeitig entfernen?

12
Vad

Ich hatte eine ähnliche Situation, in der ich eine Reihe von Ansichtscontrollern auf den Navigationscontroller-Stapel schieben ließ und dann die letzte Ansicht modal dargestellt wurde. Auf dem modalen Bildschirm habe ich eine Abbrechen-Schaltfläche, die zum Stammansichts-Controller zurückkehrt.

Im Controller für die modale Ansicht gibt es eine Aktion, die ausgelöst wird, wenn auf die Schaltfläche Abbrechen geklickt wird:

- (IBAction)cancel:(id)sender
{
    [self.delegate modalViewControllerDidCancel];
}

In der Kopfzeile dieses Modal View Controllers deklariere ich ein Protokoll:

@protocol ModalViewControllerDelegate
- (void)modalViewControllerDidCancel;
@end

Und dann sollte der letzte Ansichtscontroller im Navigationsstapel (derjenige, der die modale Ansicht präsentiert hat) das ModalViewControllerDelegate-Protokoll implementieren:

- (void)modalViewControllerDidCancel
{
    [self dismissViewControllerAnimated:NO completion:nil];
    [self.navigationController popToRootViewControllerAnimated:YES];
}

Diese obige Methode ist der wichtige Teil. Der Presenting View-Controller wird angewiesen, die modale Ansicht zu schließen, und anschließend wird er zum Root View-Controller zurückgeführt. Beachten Sie, dass ich NO an dismissViewControllerAnimated: und YES an popToRootViewControllerAnimated: übergebe, um eine gleichmäßigere Animation von der modalen Ansicht zur Stammansicht zu erhalten.

20
Steph Sharp

Ich hatte die gleiche Anforderung, verwendete jedoch benutzerdefinierte Segmente zwischen den Ansichtscontrollern. Ich bin auf das Konzept von "Unwind Segue" gestoßen, von dem ich glaube, dass es mit iOS6 kam. Wenn Sie auf iOS6 und höher abzielen, können die folgenden Links hilfreich sein: Wofür gibt es Abwicklungssegmente und wie werden sie verwendet?http://chrisrisner.com/Unwinding-with-iOS-and-Storyboards Danke.

4
cfc16

Angenommen, Ihr AppDelegate heißt AppDelegate, dann können Sie Folgendes tun, um den rootviewcontroller für das App-Fenster als Ansicht RootViewController zurückzusetzen

AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];
RootViewController *rootView = [[RootViewController alloc] init];
[appDel.window setRootViewController:rootView];
0
Adam Richardson