【问题标题】:Back navigation in iphone applicationiPhone应用程序中的后退导航
【发布时间】:2011-07-06 11:27:37
【问题描述】:

有什么方法可以在我的 iPhone 应用程序中按下后退按钮时捕捉事件?现在,我正在使用一个带有名为 Back 的图像的按钮并为此定义操作。

我的客户端需要默认的后退按钮指向上一个屏幕,因此根据点击事件,我应该能够使其指向特定屏幕,以便显示该屏幕的标题。

简而言之,我需要返回按钮来显示我需要的标题,这可能吗?

提前致谢。

【问题讨论】:

    标签: iphone objective-c xcode uinavigationcontroller back-button


    【解决方案1】:

    UINavigationBarDelegate 可能是您处理– navigationBar:didPopItem: 消息时最接近检测按钮是否被按下的方法。

    这将在按下后退按钮或当您的代码从导航控制器堆栈本身弹出视图时调用。如果您的代码手动弹出视图,那么设置一个标志以指示您的代码何时启动弹出视图应该很简单,因此您可以确定何时点击后退按钮

    在您的 UINavigationBarDelegate 实现中,创建一个布尔属性,例如 poppedInCode,您在代码执行弹出之前将其设置为 true 并实现委托,如下所示:

    - (void) navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item
    {
        if (!self.poppedInCode) {
            // back button was tapped
        }
    
        // set to false ready for the next pop
        self.poppedInCode = FALSE;
    }
    

    与当前接受的答案相比,这具有优势,因为它不需要对 Apple 文档中说您不应该进行子类化的组件进行子类化。它还保留了内置后退按钮的所有行为,而无需您对其进行重写。

    【讨论】:

      【解决方案2】:

      有两种方法可以做到这一点:

      1. 自己实现后退按钮,调用UINavigationController的- (UIViewController *)popViewControllerAnimated:(BOOL)animated

      2. 子类 UINavigationController 并实现 - (UIViewController *)popViewControllerAnimated:(BOOL)animated 进行处理并将调用传递给 super。

      3. 正如另一个答案中所建议的,UINavigationBarDelegate 允许您在处理 – navigationBar:didPopItem: 消息时检测按钮是否已被按下。

      【讨论】:

      • UINavigationController 的文档不鼓励您进行子类化,因此我不推荐选项 2
      • 自己实现后退按钮意味着使用带有后退图像的按钮并定义该按钮单击事件仪式的操作? 如果是这样的话,我正在我的如前所述,当前场景中的代码。
      【解决方案3】:

      您可以在viewWillDisappear: 方法中编写代码,并在viewWillAppear 中设置标志 bBackClicked = true,如果您从当前视图控制器推送任何其他控制器,则设置标志 bBackClicked = false。

      【讨论】:

        【解决方案4】:

        此方法比提供的其他方法更简单。这种方法的一个优点是您不需要使用委托方法使代码变得不必要地复杂化。如果您已经有 UINavigationController 的委托,此方法也更容易实现,因为它一次只能有一个委托引用。

        -(void)viewWillDisappear:(BOOL)animated {
            if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
                // 'Back' button was pressed.  We know this is true because self is no longer
                // in the navigation stack.
            }
        
            [super viewWillDisappear:animated];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          • 2020-05-01
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多