2012-04-04 5 views
45

Ich habe einen Blick auf ein Storyboard das hat eine Schaltfläche, um eine bestimmte Aktion auszuführen. Um diese Aktion auszuführen, muss der Benutzer jedoch angemeldet sein. Der Button-Handler testet, ob der Benutzer angemeldet ist und führt einen Durchgang bei JA und einen anderen bei NEIN durch. Die NO-Segmente werden an einen Login-View-Controller gesendet. Es gibt einen weiteren Übergang, der zurück zum ersten View-Controller führt. Wenn die Anmeldung erfolgreich ist, kann der Benutzer dort weitermachen, wo er aufgehört hat. Die View-Controller sind in einen Navigationscontroller eingebettet.Wie zurück zu einem UIViewController, der bereits geladen ist?

Problem ist, das 'Return' Segment lädt eine ganz neue Instanz des View-Controllers und nicht auf die ursprüngliche Instanz verweisen, so dass ich mit leeren Schnittstellenelementen und 2 Kopien dieser Ansicht Controller im Speicher.

Wie kann ich zur ursprünglichen Instanz des View-Controllers zurückkehren?

Antwort

135

Mit der Verwendung von "push" meinen Sie, dass Sie eine UINavigationController verwenden, dann können Sie die folgenden verwenden, um an die Spitze des Stapels zurückzukehren.

[self.navigationController popToRootViewControllerAnimated:YES]; 

oder

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>]; 
[self.navigationController popToViewController:prevVC animated:YES]; 

auf ein bestimmtes Niveau Pop, wo <n> das Niveau ist.

oder

[self.navigationController popViewControllerAnimated:YES]; 

Wenn Sie nur eine Ebene Stack wieder auf die Navigation Pop.

+1

Ich habe eine UIBarButton, die zunächst in ViewDidLoad im vorherigen Bildschirm geladen wird (die wir zurückgehen). Wenn ich Ihren Code verwende, wird UIBar überhaupt nicht angezeigt. Irgendeine Idee warum? – c0d3Junk13

33

Anstatt ein Segment zu verwenden, um zum vorherigen Controller zurückzukehren, sollten Sie das Ereignis verwenden, das mit dem zurückgehenden Segment verknüpft war, anstatt den aktuellen Ansichtscontroller zu verwerfen (wenn segue modal war) oder aus dem Navigationscontroller zu entfernen (Wenn das Segment gedrückt wurde) und der vorherige Controller wird automatisch angezeigt.

Wenn beispielsweise der modale Übergang, der zurückgeht, ausgeführt wurde, als Sie auf Ihrem Anmeldebildschirm eine Taste drückten, löschten Sie den Übergang aus dem Storyboard und dem Touch-up-Ereignis des Buttons, den Sie mit Ihrer Aktion verknüpfen nach erfolgreichem Login nennen:

[self dismissViewControllerAnimated:YES completion:nil]; 

auf dem Storyboard, werden Sie direkt auf der Schaltfläche klicken und die Ausbesserungs innen gesendet Ereignis an den Ersthelfer der view-Controller-Szene ziehen. Dies führt den umgekehrten Übergang aus, der beim Ausführen des Überganges ausgeführt wurde. Sie können dafür einen modalen Übergang verwenden, ohne einen Navigationscontroller zu verwenden.

Wenn Sie die Anmeldungsansicht auf den Navigationscontroller verschoben haben, müssen Sie sie vom Stapel entfernen (wenn Sie zur vorherigen Ansicht zurückkehren). Verwenden Sie eine der folgenden Optionen:

[[self navigationController] popViewControllerAnimated:YES]; // goes back to previous view 
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack 

Der animierte Übergang sollte die Art des Übergangs auf den Übergang verwendet umkehren, so Einrollen wird gekräuselt nach unten, wenn Sie die Ansicht schließen.

+0

Wenn Sie ein benutzerdefiniertes Segment verwenden, z. B. einen Nicht-Folien-Effekt für ein Push-Segment, ist der Pop-Effekt nicht das Gegenteil Ihres benutzerdefinierten Segments, sondern nur ein Folieneffekt. – nenchev

2

malhal ist recht - es auf dem Link klicken lohnt.

Der Code scheint sich etwas von Apples Beispiel zu entfernen und ist noch flexibler. Ich habe drei Szenen, aber nur eine benutzerdefinierte ViewController-.m-Datei. Ich wollte keinen Navigationsstapel. Der Zugriff auf die nachfolgenden Szenen erfolgt über Schaltflächen. Ich habe diese Zeile in der Basisansicht Controller .m-Datei:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{} 

Dann in der dritten Szene, die ich von einer Schaltfläche zum Ausgang Symbol-geschleppt steuern und ausgewählt, um die Abwickler Aktion. Es fällt nun von Szene 3 zurück auf Szene 2, ohne dass eine Methode "disneyViewController" aufgerufen werden muss.

+0

Ich glaube, das Wichtigste, was ich schließlich verstanden habe, war, dass es Ihren Stack auflösen wird, bis er einen Controller erreicht, der die mit dem spezifischen Exit-Abschnitt, den Sie verwenden, verbundene Abwicklungsaktion implementiert. Sie können also mehrere Exit-Abzweigungen mit unterschiedlichen Abwicklungsaktionen definieren und anschließend die spezifische Abwicklungsaktion für jedes der Segmente in der Steuereinheit implementieren, auf der Sie landen möchten. –

Verwandte Themen