web-dev-qa-db-fra.com

Comment créer une confirmation Pop Up lorsque vous repoussez le bouton de retour dans iOS?

Je veux ajouter une apparition lorsque quelqu'un appuie sur le bouton "Retour" de mon application iOS, pour demander à l'utilisateur s'il veut vraiment revenir. Ensuite, en fonction de la réponse de l'utilisateur, je voudrais annuler l'action ou continuer. J'ai essayé d'ajouter le code dans la fonction de viewwilldisappart de ma vue, puis écrivez le délégué approprié, mais cela ne fonctionne pas, car il change toujours la vue, puis montrer la fenêtre contextuelle. Mon code est:

    -(void) viewWillDisappear:(BOOL)animated {
       _animated = animated;
       if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
           UIAlertView *alert_undo = [[UIAlertView alloc] initWithTitle:@"UIAlertView"
                                                                message:@"You could be    loosing information with this action. Do you want to proceed?"
                                                               delegate:self
                                                      cancelButtonTitle:@"Go back"
                                                      otherButtonTitles:@"Yes", nil];
           [alert_undo show];
       }
       else [super viewWillDisappear:animated];
   }

Et la mise en œuvre des délégués est la suivante:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if([title isEqualToString:@"Yes"])
    {
        [super viewWillDisappear:_animated];
    }
}

Cela ne fonctionne pas du tout. Quelqu'un maintenant est-il un meilleur moyen de le faire ou de ce qui pourrait être faux?

Merci beaucoup,

17
recasens

Merci pour votre réponse, @sticvoidman! J'ai finalement utilisé votre code avec quelques modifications. Le bouton arrière ne peut pas être modifié, il faut donc créer un bouton supplémentaire et caché la norme. Le seul problème est le style du nouveau bouton "arrière", qui n'est pas égal à celui de la norme. Le code final est:

- (void)viewDidLoad
{

    self.navigationItem.hidesBackButton = YES;
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self
                                                                action:@selector(goBack:)];

    self.navigationItem.leftBarButtonItem = bbtnBack;

}

- (void)goBack:(UIBarButtonItem *)sender
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"...Do you want to proceed?"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
    [alert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex) {
        case 0: //"No" pressed
            //do something?
            break;
        case 1: //"Yes" pressed
            //here you pop the viewController
            [self.navigationController popViewControllerAnimated:YES];
            break;
    }
}
15
recasens

Une fois que -viewWillDisappear: est appelé, il n'y a pas d'arrêt de votre viewController de la disparition.

Vous devriez idéalement, remplacer le bouton Back navigationBar et dans sa méthode, affichez l'alerte ( le reste étant à peu près le même) ==)

- (void)viewDidLoad
{
    //...
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self
                                                                action:@selector(goBack:)];

    [self.navigationItem setBackBarButtonItem: bbtnBack];
}

- (void)goBack:(UIBarButtonItem *)sender
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"...Do you want to proceed?"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
    [alert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex) {
        case 0: //"No" pressed
            //do something?
            break;
        case 1: //"Yes" pressed
            //here you pop the viewController
            [self.navigationController popViewControllerAnimated:YES];
            break;
    }
}

[~ # ~] note [~ # ~ ~]: N'oubliez pas de déclarer <UIAlertViewDelegate> dans le fichier . h fichier de ce viewController

18
staticVoidMan