【问题标题】:Is there a way to stop a UIViewController from being popped from a UINavigationController's stack when the backBarButtonItem is tapped?当点击 backBarButtonItem 时,有没有办法阻止 UIViewController 从 UINavigationController 的堆栈中弹出?
【发布时间】:2011-02-11 17:43:55
【问题描述】:

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

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

使用viewWillDisappear: 不起作用,因为虽然我可以生成警报视图,但我无法找到防止弹出发生的方法。警报视图显示,但视图控制器仍然弹出,它们返回到根视图控制器(显示警报视图)。

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

【问题讨论】:

    标签: iphone cocoa-touch uiviewcontroller uinavigationcontroller


    【解决方案1】:

    你可以用你自己的替换后退按钮,在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"); 
    
        }
    }
    

    【讨论】:

    • 有什么方法可以设置按钮的样式,让它看起来像熟悉的左指按钮?
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 实际上,我已经在一个模式视图控制器中,它有一个导航控制器作为它的根视图。然后,我推动视图控制器,即我所指的具有后退栏按钮的视图控制器。我会考虑禁用后退按钮。我不想只禁用按钮(所以我也喜欢你有某种类型通知的想法),因为如果他们不知道为什么他们不能做某事,这可能会让用户感到沮丧。
    【解决方案3】:

    让他们回去,除非它完全有效,否则不要保存任何东西。这通常是 Apple 采用的方法。

    【讨论】:

    • 问题在于它可能看起来就像我的应用程序无法正常工作一样。如果用户做出我没有保存的选择然后转到上一个屏幕,她可能不知道为什么没有保存更改并责怪我的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多