我有一个带有根视图控制器的UINavigationController,然后我将UIViewController推到导航控制器的堆栈上。当用户点击backBarButtonItem时,我希望能够在满足某些条件时弹出警报视图并取消视图控制器的弹出窗口。例如,用户可以进行某些选择,但是它们的某些组合可能无效,因此我想通知他们进行更改。
我知道我可以阻止用户进行无效组合,或者在选择了无效组合时弹出警报视图,但我宁愿不这样做。用户可能正在更改选择,并且可能意识到某个组合无效但我宁愿让他们选择使组合无效的内容然后更改其他内容(如果他们在尝试之前没有进行更改则通知他们)到上一个屏幕)。例如,如果我阻止他们选择构成无效组合的内容,那么他们可能需要在屏幕上向上滚动,更改内容,然后向下滚动而不是进行选择,然后向上滚动并更改内容。
使用viewWillDisappear:
不起作用,因为虽然我可以生成警报视图,但我无法找到防止爆发的方法。将显示警报视图,但视图控制器仍会弹出,并且它们将返回到根视图控制器(显示警报视图)。
有没有办法防止爆发?如果没有,这是否值得提交错误报告,或者这是不必要的和/或深奥的?
答案 0 :(得分:7)
您可以将自己的后退按钮替换为在loadView中调用所需方法的后退按钮
cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(onCancelButtonSelected:)];
self.navigationItem.leftBarButtonItem = cancelButton;
然后再
-(void)onCancelButtonSelected:(id)sender {
if (!hasSavedProduct)
{
cancelAlert = [[UIAlertView alloc] initWithTitle:@"Product not saved"
message:@"Exit without saving?"
delegate:self
cancelButtonTitle:@"Exit"
otherButtonTitles:@"Save",
nil];
[cancelAlert show];
[cancelAlert release];
}
然后让他们去
- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if ([cancelAlert isEqual:actionSheet])
{
if (buttonIndex == 0)
{
NSLog(@"Fine. Exiting without saving");
[self.navigationController popViewControllerAnimated:YES];
}
else
{
NSLog(@"Save here");
}
}
答案 1 :(得分:1)
对于模态视图控制器而言,这听起来比对导航堆栈上的视图控制器更合适。
如果你已经结婚了,那么如果你可以用UINavigationControllerDelegate做到这一点,那就太好了,但你做不到。
是否可以将“后退”按钮设置为禁用,直到条目有效?也许当用户尝试输入某些东西,但它无效时,在View的顶部附近,您可以使用红色文本将Label设置为动画,告诉用户需要修复它。同时后退按钮被禁用,并在进行更正后重新启用。
或者让您的UI控件如何工作以确保用户永远不会输入错误数据。
答案 2 :(得分:1)
让他们回去,除非它完全有效,否则不要保存任何东西。这通常是Apple采取的方法。