Während viewWillAppear()
und viewDidDisappear()
werden aufgerufen , wenn die Zurück - Taste abgegriffen wird, werden sie auch zu anderen Zeiten genannt. Weitere Informationen hierzu finden Sie am Ende der Antwort.
Verwenden von UIViewController.parent
Das Erkennen der Zurück-Schaltfläche ist besser, wenn der VC mithilfe von willMoveToParentViewController(_:)
OR von seinem übergeordneten Element (dem NavigationController) entfernt wirddidMoveToParentViewController()
Wenn übergeordnetes Element Null ist, wird der Ansichts-Controller vom Navigationsstapel entfernt und geschlossen. Wenn übergeordnetes Element nicht Null ist, wird es dem Stapel hinzugefügt und angezeigt.
// Objective-C
-(void)willMoveToParentViewController:(UIViewController *)parent {
[super willMoveToParentViewController:parent];
if (!parent){
// The back button was pressed or interactive gesture used
}
}
// Swift
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
// The back button was pressed or interactive gesture used
}
}
Swap - out willMove
für didMove
und Check self.parent zu tun Arbeit nach der View - Controller des Feldes verwiesen.
Die Entlassung stoppen
Beachten Sie, dass Sie beim Überprüfen des übergeordneten Elements den Übergang nicht "anhalten" können, wenn Sie eine Art asynchrones Speichern durchführen müssen. Dazu können Sie Folgendes implementieren. Der einzige Nachteil hierbei ist, dass Sie den ausgefallenen iOS-gestalteten / animierten Zurück-Button verlieren. Seien Sie auch hier vorsichtig mit der interaktiven Wischgeste. Verwenden Sie Folgendes, um diesen Fall zu behandeln.
var backButton : UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
// Disable the swipe to make sure you get your chance to save
self.navigationController?.interactivePopGestureRecognizer.enabled = false
// Replace the default back button
self.navigationItem.setHidesBackButton(true, animated: false)
self.backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
self.navigationItem.leftBarButtonItem = backButton
}
// Then handle the button selection
func goBack() {
// Here we just remove the back button, you could also disabled it or better yet show an activityIndicator
self.navigationItem.leftBarButtonItem = nil
someData.saveInBackground { (success, error) -> Void in
if success {
self.navigationController?.popViewControllerAnimated(true)
// Don't forget to re-enable the interactive gesture
self.navigationController?.interactivePopGestureRecognizer.enabled = true
}
else {
self.navigationItem.leftBarButtonItem = self.backButton
// Handle the error
}
}
}
Weitere Informationen werden / wurden angezeigt
Wenn Sie das viewWillAppear
viewDidDisappear
Problem nicht erhalten haben , lassen Sie uns ein Beispiel durchgehen. Angenommen, Sie haben drei Ansichts-Controller:
- ListVC: Eine Tabellenansicht der Dinge
- DetailVC: Details zu einer Sache
- SettingsVC: Einige Optionen für eine Sache
Lets folgen auf die die Anrufe , detailVC
wie Sie von unterwegs listVC
auf settingsVC
und zurück zulistVC
Liste> Detail (Push DetailVC) Detail.viewDidAppear
<-
Detail anzeigen > Einstellungen (Push SettingsVC) Detail.viewDidDisappear
<- verschwinden
Und wenn wir zurückgehen ...
Einstellungen> Detail (Pop-EinstellungenVC) Detail.viewDidAppear
<-
Detail anzeigen > Liste (Pop-DetailVC) Detail.viewDidDisappear
<- verschwinden
Beachten Sie, dass dies viewDidDisappear
mehrmals aufgerufen wird, nicht nur beim Zurückgehen, sondern auch beim Vorwärtsgehen. Für einen schnellen Vorgang, der möglicherweise erwünscht ist, für einen komplexeren Vorgang wie das Speichern eines Netzwerkaufrufs jedoch möglicherweise nicht.