在iPhone应用程序中返回导航

时间:2011-07-06 11:27:37

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

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

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

总之,我需要后退按钮来显示我需要的标题,是否可能?

提前致谢。

4 个答案:

答案 0 :(得分:6)

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

当按下后退按钮或代码弹出导航控制器堆栈本身的视图时,将调用此方法。如果您的代码是手动弹出视图,那么设置一个标志来指示代码何时启动弹出窗口应该是微不足道的,因此您可以确定何时触发后退按钮

在你的UINavigationBarDelegate实现中创建一个布尔属性,例如poppedInCode,你可以在代码执行pop之前设置为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的文档说您不应该进行子类化的组件的子类化。它还保留了内置后退按钮的所有行为,而无需重写它。

答案 1 :(得分:3)

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

  1. 自己实施后退按钮并拨打UINavigationController的{​​{1}}

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

  3. 正如另一个回答super中所建议的那样,如果您处理UINavigationBarDelegate消息,则可以检测按钮是否已被按下。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

此方法比其他方法简单。此方法的一个优点是您不需要使用委托方法不必要地使代码复杂化。如果您已经拥有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];
}