149 votes

Détection de l'appui sur le bouton "retour" d'une barre de navigation

J'ai besoin d'exécuter certaines actions lorsque le bouton Retour (retour à l'écran précédent, retour à la vue parent) est pressé sur une barre de navigation.

Existe-t-il une méthode que je puisse mettre en œuvre pour attraper l'événement et déclencher des actions pour mettre en pause et sauvegarder les données avant que l'écran ne disparaisse ?

0 votes

1 votes

Regardez le solution dans ce fil

0 votes

Je l'ai fait de cette façon montrer la décision ici

8voto

Chris Villa Points 1453

Cela fonctionne pour moi dans iOS 9.3.x avec Swift :

override func didMoveToParentViewController(parent: UIViewController?) {
    super.didMoveToParentViewController(parent)

    if parent == self.navigationController?.parentViewController {
        print("Back tapped")
    }
}

Contrairement aux autres solutions proposées ici, celle-ci ne semble pas se déclencher de manière inattendue.

7voto

Pedro Magalhães Points 195

Vous pouvez utiliser le callback du bouton retour, comme ceci :

- (BOOL) navigationShouldPopOnBackButton
{
    [self backAction];
    return NO;
}

- (void) backAction {
    // your code goes here
    // show confirmation alert, for example
    // ...
}

pour la version swift vous pouvez faire quelque chose comme dans la portée globale

extension UIViewController {
     @objc func navigationShouldPopOnBackButton() -> Bool {
     return true
    }
}

extension UINavigationController: UINavigationBarDelegate {
     public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
          return self.topViewController?.navigationShouldPopOnBackButton() ?? true
    }
}

Celui du dessous que vous mettez dans le viewcontroller où vous voulez contrôler l'action du bouton retour :

override func navigationShouldPopOnBackButton() -> Bool {
    self.backAction()//Your action you want to perform.

    return true
}

4voto

Paul Brady Points 177

Pour info, je pense que c'est plus ce qu'il cherchait

    UIBarButtonItem *l_backButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:self action:@selector(backToRootView:)];

    self.navigationItem.leftBarButtonItem = l_backButton;

    - (void) backToRootView:(id)sender {

        // Perform some custom code

        [self.navigationController popToRootViewControllerAnimated:YES];
    }

3voto

Harald Points 198

La meilleure façon de procéder est d'utiliser les méthodes de délégation de UINavigationController.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

Grâce à cela, vous pouvez savoir quel contrôleur affiche le UINavigationController.

if ([viewController isKindOfClass:[HomeController class]]) {
    NSLog(@"Show home controller");
}

2voto

Murray Sagal Points 1053

Pour Swift avec un UINavigationController :

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    if self.navigationController?.topViewController != self {
        print("back button tapped")
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X