Alors que viewWillAppear()
et viewDidDisappear()
sont appelés lorsque le bouton de retour est appuyé, ils sont également appelés à d'autres moments. Voir la fin de la réponse pour en savoir plus.
Utilisation de UIViewController.parent
Il est préférable de détecter le bouton de retour lorsque le VC est supprimé de son parent (le NavigationController) à l'aide de willMoveToParentViewController(_:)
OUdidMoveToParentViewController()
Si parent est nul, le contrôleur de vue est sorti de la pile de navigation et rejeté. Si le parent n'est pas nul, il est ajouté à la pile et présenté.
// 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 sur willMove
pour didMove
et le contrôle self.parent pour faire le travail après le contrôleur de vue est rejeté.
Arrêter le licenciement
Notez que la vérification du parent ne vous permet pas de "suspendre" la transition si vous devez faire une sorte de sauvegarde asynchrone. Pour ce faire, vous pouvez implémenter ce qui suit. Le seul inconvénient ici est que vous perdez le bouton de retour de style / animé iOS. Faites également attention ici avec le geste de balayage interactif. Utilisez ce qui suit pour gérer ce cas.
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
}
}
}
Plus sur la vue apparaîtra / est apparu
Si vous n'avez pas rencontré le viewWillAppear
viewDidDisappear
problème, passons en revue un exemple. Supposons que vous ayez trois contrôleurs de vue:
- ListVC: un tableau des choses
- DetailVC: Détails sur une chose
- SettingsVC: Quelques options pour une chose
Permet de suivre les appels au detailVC
fur et à mesure que vous passez de listVC
à settingsVC
et de retour àlistVC
Liste> Détail (push detailVC) Detail.viewDidAppear
<- apparaît
Detail> Settings (push settingsVC) Detail.viewDidDisappear
<- disparaît
Et comme nous revenons en arrière ...
Paramètres> Détail (pop settingsVC) Detail.viewDidAppear
<- apparaissent
Détails> Liste (pop detailVC) Detail.viewDidDisappear
<- disparaissent
Remarquez qu'il viewDidDisappear
est appelé plusieurs fois, non seulement lors du retour, mais également lors de la progression. Pour une opération rapide qui peut être souhaitée, mais pour une opération plus complexe comme un appel réseau à enregistrer, ce n'est peut-être pas le cas.