Как создать подтверждение Pop Up при нажатии кнопки "Назад" в iOS?

Я хочу добавить всплывающее окно, когда кто-то нажимает кнопку "Назад" моего приложения iOS, чтобы спросить пользователя, действительно ли он хочет вернуться. Затем, в зависимости от ответа пользователя, я хотел бы отменить действие или продолжить. Я попытался добавить код в функцию viewWillDisappear моего представления, а затем написать нужный делегат, но он не работает, потому что он всегда меняет представление, а затем показывает всплывающее окно. Мой код:

    -(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];
   }

И реализация делегата:

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

Это не работает вообще. Кто-нибудь теперь лучший способ сделать это или что может быть неправильно?

Большое спасибо,

Ответы

Ответ 1

Спасибо за ваш ответ @staticVoidMan! Я, наконец, использовал ваш код с некоторыми изменениями. Кнопка "Назад" не может быть изменена, поэтому необходимо создать дополнительную кнопку и скрыть стандартную. Единственная проблема - стиль новой кнопки "Назад", которая не равна стандартной. Конечный код:

- (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;
    }
}

Ответ 2

Как только -viewWillDisappear: вызывается, не прекращается исчезновение вашего viewController.

В идеале вы должны переопределить кнопку navigationBar назад и в этом методе отобразить предупреждение (остальное почти то же самое)

- (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;
    }
}

ПРИМЕЧАНИЕ. Не забудьте объявить <UIAlertViewDelegate> в файле .h этого viewController