找出用户是否按下了uinavigationcontroller中的后退按钮?

时间:2011-05-23 00:57:51

标签: iphone objective-c

当视图加载时,我想查看是否是因为用户按下了后退按钮。我怎么检查这个?

7 个答案:

答案 0 :(得分:107)

我发现检测UINavigationController的后退按钮(iOS 5.0之前)的最佳解决方案是验证当前视图控制器不在导航控制器的视图控制器堆栈中。

- (void)viewDidDisappear:(BOOL)animated中以逻辑方式检查此条件可能更安全,在调用方法时,视图控制器极有可能从堆栈中删除。

iOS 5.0之前版本:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (![[self.navigationController viewControllers] containsObject:self]) {
        // We were removed from the navigation controller's view controller stack
        // thus, we can infer that the back button was pressed
    }
}

iOS 5.0+,您可以使用-didMoveToParentViewController:

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    // parent is nil if this view controller was removed
}

答案 1 :(得分:80)

在viewWillDisappear方法中检查

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if ([self isMovingFromParentViewController]) {
      //specific stuff for being popped off stack
    }
}

这仅适用于iOS 5后

答案 2 :(得分:7)

UINavigationController有一个delegate属性,用于发出委托回调。请参阅the iOS reference here

委托没有“后退按钮”回调,而是告诉你什么时候会出现在导航堆栈上。当您按下时,您将顶部视图控制器“弹出”到堆栈中,因此它将告诉您视图即将出现。我认为这是你要寻找的回调。

你可以有一些简单的逻辑来检查它是否是“感兴趣”的视图控制器,然后你可以发送通知,等等。

答案 3 :(得分:5)

为了完整起见,在Swift中混合了两个最受欢迎的答案(12):

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {
        // view controller is popping
    }
}

答案 4 :(得分:2)

这是一个略有不同的情况,但我认为该解决方案可能会帮助其他人。

在我的情况下,我在UIPopoverController中有一个UINavigationController。我需要检测用户是否单击了后退按钮,或者是否在弹出窗口外单击了。为此,我检查了viewWillDisappear中的visibleViewController属性。如果视图控制器在关闭时仍然是visibleViewController,则弹出窗口将通过其他方式关闭。如果视图控制器在关闭时不是visibleViewController,则按下后退按钮。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.navigationController.visibleViewController != self) {
        <Do something since we're closing using something else>
    } else {
        <Do something since we're closing because of the back button>
    }
}

我尝试使用zach的解决方案,但isMovingFromParentViewController在两种情况下都返回true。

我验证了这适用于iOS 5 +

我希望这会有所帮助。

答案 5 :(得分:2)

创建自定义后退栏按钮并设置目标

第1步:将这些方法添加到您的班级

- (void)backButtonClicked :(id)sender{
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)addBackBarButton{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, 55, 35);
    [button setTitle:@"back" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    self.navigationItem.leftBarButtonItem = customBarItem;
}

第2步:在viewDiDLoad方法中调用 [self addBackBarButton];

您将在 backButtonClicked 方法中获得操作。你可以按照你想要的方式玩它。

干杯!

答案 6 :(得分:-10)

执行此操作的唯一方法是确保它是后退按钮,即可创建自定义按钮。如果您不知道如何操作,请查看此tutorial。它看起来不像普通的后退按钮,但接近。如果您需要更多帮助,请发表评论