有什么方法可以在点击backBarButtonItem时阻止UIViewController从UINavigationController的堆栈中弹出?

yab*_*ada 6 iphone cocoa-touch uiviewcontroller uinavigationcontroller

我有一个带有根视图控制器的UINavigationController,然后我将UIViewController推到导航控制器的堆栈上.当用户点击backBarButtonItem时,我希望能够在满足某些条件时弹出警报视图并取消视图控制器的弹出窗口.例如,用户可以进行某些选择,但是它们的某些组合可能无效,因此我想通知他们进行更改.

我知道我可以阻止用户进行无效组合,或者在选择了无效组合时弹出警报视图,但我不想这样做.用户可能正在更改选择并且可能意识到某个组合无效但我宁愿让他们选择使组合无效的内容然后更改其他内容(如果他们在尝试之前没有进行更改则通知他们)到上一个屏幕).例如,如果我阻止他们选择构成无效组合的东西,那么他们可能必须在屏幕上向上滚动,更改某些内容,然后向下滚动而不是进行选择然后向上滚动并更改某些内容.

使用viewWillDisappear:不起作用,因为虽然我可以产生一个警报视图,但我无法找到一种方法来防止爆发发生.将显示警报视图,但视图控制器仍会弹出,并且它们将返回到根视图控制器(显示警报视图).

有没有办法防止爆发?如果没有,这是否值得提交错误报告,或者这是不必要的和/或深奥的?

jvc*_*ave 7

您可以将自己的后退按钮替换为在loadView中调用所需方法的后退按钮

cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" 
                                    style:UIBarButtonItemStyleBordered 
                                    target:self
                                    action:@selector(onCancelButtonSelected:)];



self.navigationItem.leftBarButtonItem = cancelButton;
Run Code Online (Sandbox Code Playgroud)

然后

-(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];
}
Run Code Online (Sandbox Code Playgroud)

那就让他们走吧

- (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"); 

    }
}
Run Code Online (Sandbox Code Playgroud)


bpa*_*apa 1

这听起来比导航堆栈上的视图控制器更适合模态视图控制器。

如果您愿意在堆栈上执行此操作,那么如果您可以使用UINavigationControllerDelegate执行此操作,那就太好了,但您不能。

是否可以将“后退”按钮设置为禁用,直到条目有效为止?也许当用户尝试输入某些内容但它无效时,在视图顶部附近您会看到一个带有红色文本的动画标签,告诉用户他们需要修复它。同时,后退按钮被禁用,并在他们进行更正后重新启用。

或者对 UI 控件的工作方式发挥真正的创意,以确保用户永远不会输入错误数据。