在iOS中离开视图之前要求用户确认

我需要在用户离开某个视图之前显示一个UIAlertView ,或者点击一个“后退”导航栏button,或者点击我拥有的标签栏中的一个标签项,以便要求他确认。 这将是一个双button提醒,一个“取消”一个留在视图中,一个“接受”一个离开。 我需要这样做,因为我必须让用户意识到如果离开,未保存的更改将会丢失。

我试图通过在viewWillDisappear:方法中创build并显示警报视图来执行此操作:

 - (void)viewWillDisappear:(BOOL)animated { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Exit", @"") message:NSLocalizedString(@"Are you sure you want to leave? Changes will be discarded", @"") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"") otherButtonTitles:NSLocalizedString(@"Accept", @""), nil]; [alertView show]; [super viewWillDisappear:animated]; } 

但是,无论如何,视图是popup窗口,警告视图显示之后,应用程序崩溃,因为它的委托是已经从导航堆栈已经popup的视图控制器…我没有find解决这个情况的方法,可以有人帮我吗?

谢谢!

当viewWillDissapear不起作用时显示警报视图,因为视图已经消失,它正在被移除。

你可以做的是在按下后退button的时候给自己添加一个自定义的动作,然后当你按下后退button时你决定要做什么,你可以显示警报视图,然后在其中一个button的过程中closures视图,像这样的东西:

 - (id)init { if (self = [super init]) { self.navigationItem.backBarButtonItem.target = self; self.navigationItem.backBarButtonItem.action = @selector(backButtonPressed:); } return self; } 

然后在按下后退button时显示警报视图:

 -(void)backButtonPressed:(id)sender { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Exit", @"") message:NSLocalizedString(@"Are you sure you want to leave? Changes will be discarded", @"") delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", @"") otherButtonTitles:NSLocalizedString(@"Accept", @""), nil]; [alertView show]; } 

现在,当按下警报视图中的确认button时,只需调用:

 [self.navigationController popViewControllerAnimated:YES]; 

或者,如果用户取消,则不做任何事情

我会试图将您要保护的数据操作移动到模态视图控制器中,并处理您select忽略模态表示的任何操作的validation。 对我来说,这是模态的一点:在与应用程序的其他部分进行交互之前必须完成的事情。