Alors que viewWillAppear()
et viewDidDisappear()
sont sont appelés lorsque l'on appuie sur le bouton retour, ils sont également appelés à d'autres moments. Voir la fin de la réponse pour en savoir plus.
Utilisation de UIViewController.parent
La détection du bouton retour est mieux réalisée lorsque le VC est retiré de son parent (le NavigationController) à l'aide de la fonction willMoveToParentViewController(_:)
OU didMoveToParentViewController()
Si parent est nil, le contrôleur de vue est retiré de la pile de navigation et renvoyé. Si parent n'est pas nil, 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
}
}
Remplacer willMove
pour didMove
et vérifier le travail de self.parent après le contrôleur de vue est rejeté.
Arrêter le licenciement
Notez que le fait de vérifier le parent ne vous permet pas de "mettre en pause" la transition si vous devez effectuer une sorte de sauvegarde asynchrone. Pour ce faire, vous pouvez implémenter ce qui suit. Le seul inconvénient est que vous perdez le bouton de retour animé de style iOS. Faites également attention au 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 d'informations apparaîtront
Si vous n'avez pas eu le viewWillAppear
viewDidDisappear
Nous allons voir un exemple. Disons que vous avez trois contrôleurs de vue :
- ListVC : Une vue en tableau des choses
- DetailVC : Détails sur une chose
- ParamètresVC : Quelques options pour une chose
Suivons les appels sur le detailVC
à mesure que vous passez de la listVC
à settingsVC
et de retour à listVC
Liste > Détail (pousser le détailVC) Detail.viewDidAppear
<- apparaître
Détail > Paramètres (pousser les paramètresVC) Detail.viewDidDisappear
<- disparaître
Et comme nous revenons en arrière...
Paramètres > Détail (pop settingsVC) Detail.viewDidAppear
<- apparaître
Détail > Liste (pop detailVC) Detail.viewDidDisappear
<- disparaître
Remarquez que viewDidDisappear
est appelé plusieurs fois, non seulement en revenant en arrière, mais aussi en allant de l'avant. Pour une opération rapide, cela peut être souhaitable, mais pour une opération plus complexe comme un appel réseau pour sauvegarder, cela peut ne pas être le cas.
0 votes
Duplicata possible de Définition de l'action du bouton retour dans le contrôleur de navigation
1 votes
Regardez le solution dans ce fil
0 votes
Je l'ai fait de cette façon montrer la décision ici