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

1voto

Coli88 Points 41

Vous devriez consulter le Protocole UINavigationBarDelegate . Dans ce cas, vous pouvez utiliser la méthode navigationBar:shouldPopItem :.

1voto

kissscoool Points 1

Comme l'a dit Coli88, vous devriez vérifier le protocole UINavigationBarDelegate.

D'une manière plus générale, vous pouvez également utiliser la fonction - (void)viewWillDisapear:(BOOL)animated pour effectuer un travail personnalisé lorsque la vue retenue par le contrôleur de vue actuellement visible est sur le point de disparaître. Malheureusement, cela couvrirait les cas de push et de pop.

1voto

Ferran Maylinch Points 394

Comme purrrminator dit, la réponse de elitalon n'est pas tout à fait juste, puisque your stuff serait exécuté même en cas de déclenchement programmé du contrôleur.

La solution que j'ai trouvée jusqu'à présent n'est pas très agréable, mais elle fonctionne pour moi. En plus de ce que elitalon dit, je vérifie aussi si je suis en train d'éclater de manière programmatique ou non :

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];

  if ((self.isMovingFromParentViewController || self.isBeingDismissed)
      && !self.isPoppingProgrammatically) {
    // Do your stuff here
  }
}

Vous devez ajouter cette propriété à votre contrôleur et lui attribuer la valeur YES avant de lancer le programme :

self.isPoppingProgrammatically = YES;
[self.navigationController popViewControllerAnimated:YES];

Merci pour votre aide !

1voto

Eric Points 21

J'ai résolu ce problème en ajoutant un UIControl à la barre de navigation sur le côté gauche.

UIControl *leftBarItemControl = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 90, 44)];
[leftBarItemControl addTarget:self action:@selector(onLeftItemClick:) forControlEvents:UIControlEventTouchUpInside];
self.leftItemControl = leftBarItemControl;
[self.navigationController.navigationBar addSubview:leftBarItemControl];
[self.navigationController.navigationBar bringSubviewToFront:leftBarItemControl];

Et vous devez vous rappeler de l'enlever lorsque la vue disparaît :

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    if (self.leftItemControl) {
        [self.leftItemControl removeFromSuperview];
    }    
}

C'est tout !

1voto

micromanc3r Points 559

7ynk3r La réponse de l'auteur était très proche de ce que j'ai utilisé en fin de compte, mais elle nécessitait quelques ajustements :

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

    UIViewController *topViewController = self.topViewController;
    BOOL wasBackButtonClicked = topViewController.navigationItem == item;

    if (wasBackButtonClicked) {
        if ([topViewController respondsToSelector:@selector(navBackButtonPressed)]) {
            // if user did press back on the view controller where you handle the navBackButtonPressed
            [topViewController performSelector:@selector(navBackButtonPressed)];
            return NO;
        } else {
            // if user did press back but you are not on the view controller that can handle the navBackButtonPressed
            [self popViewControllerAnimated:YES];
            return YES;
        }
    } else {
        // when you call popViewController programmatically you do not want to pop it twice
        return YES;
    }
}

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