67 votes

Savoir si l’utilisateur a appuyé sur le bouton Retour dans uinavigationcontroller?

Quand une vue est chargée, je veux voir si c'est parce que l'utilisateur a appuyé sur le bouton Précédent. Comment puis-je vérifier cela?

110voto

Andrew Points 4419

La meilleure solution que j'ai trouvé pour détecter un UINavigationController touche back (retour) appuyez sur la touche (pré-iOS 5.0) est en vérifiant que le point de vue actuel contrôleur n'est pas présent dans le dans le de navigation du contrôleur de-vue-contrôleur de la pile.

Il est peut-être plus sûr de vérifier cette condition, en - (void)viewDidDisappear:(BOOL)animated que logiquement, une fois que la méthode est appelée, elle serait extrêmement probable que le point de vue du contrôleur a été retiré de la pile.

Pré-iOS 5.0:

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

    if (![[self.navigationController viewControllers] containsObject:self]) {
        // We were removed from the navigation controller's view controller stack
        // thus, we can infer that the back button was pressed
    }
}

iOS 5.0+ vous pouvez utiliser -didMoveToParentViewController:

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    // parent is nil if this view controller was removed
}

81voto

zach Points 311

dans votre vueWillDisappear vérification de la méthode

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

    if ([self isMovingFromParentViewController]) {
      //specific stuff for being popped off stack
    }
}
 

Ceci est seulement pour post iOS 5

7voto

makdad Points 4670

UINavigationController a un delegate bien que les questions délégué rappels. Veuillez voir le iOS de référence ici.

Le délégué ne pas avoir un "bouton" de rappel, mais au lieu de cela, il vous dit quand quelque chose va apparaître sur la pile de navigation. Lorsque vous appuyez sur la touche back, vous êtes le "popping" la vue de dessus contrôleur hors de la pile, donc il va vous dire que la vue est sur le point d'apparaître. Je pense que c'est le rappel que vous seriez à la recherche pour.

Vous pourriez avoir une logique simple pour vérifier si il est le point de vue contrôleur "intéressés", et puis vous pouvez envoyer une notification, et al.

2voto

Matt Becker Points 811

C'est un peu différente de scénario, mais j'ai pensé que la solution pourrait aider les autres.

Dans ma situation, j'ai eu un UINavigationController dans un UIPopoverController. J'avais besoin de détecter si l'utilisateur a cliqué sur le bouton de retour, ou cliqué en dehors de la liste. Pour ce faire, j'ai vérifié le visibleViewController propriété dans viewWillDisappear. Si le point de vue du contrôleur est toujours le visibleViewController lors de la fermeture, puis la liste est en cours de fermeture par un autre moyen. Si le point de vue du contrôleur n'est pas le visibleViewController lors de la fermeture, puis le dos bouton a été pressé.

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

    if (self.navigationController.visibleViewController != self) {
        <Do something since we're closing using something else>
    } else {
        <Do something since we're closing because of the back button>
    }
}

J'ai essayé à l'aide de zach solution, mais isMovingFromParentViewController retourne vrai pour les deux cas.

J'ai vérifié cela fonctionne sous iOS 5+

J'espère que cette aide.

2voto

aToz Points 1387

Créez un bouton de barre arrière personnalisé et définissez la cible,

Étape 1: Ajoutez ces méthodes à votre classe

 - (void)backButtonClicked :(id)sender{
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)addBackBarButton{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, 55, 35);
    [button setTitle:@"back" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
}
 

Étape 2: Appelez [self addBackBarButton]; dans la méthode viewDiDLoad

Vous obtiendrez l'action dans la méthode backButtonClicked . Vous pouvez jouer avec comme vous le souhaitez.

À votre santé!

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