Как создать подтверждение 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