了解用户是否按下了uinavigationcontroller中的后退button?

当一个视图加载,我想看看是否因为用户按下后退button。 我如何检查这个?

要做到这一点的唯一方法,所以你肯定知道这是后退button是创build一个自定义button。 如果您不知道如何做,请查看本教程 。 它看起来不像普通的后退button,但很接近。 如果您需要更多帮助,请发表评论

我发现检测UINavigationController后退buttonbutton(iOS 5.0之前)的最佳解决scheme是validation当前视图控制器不存在于导航控制器的视图控制器堆栈中。

- (void)viewDidDisappear:(BOOL)animated检查这个条件可能比较安全,因为在调用方法的时候,视图控制器很有可能从堆栈中移除。

Pre-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 } 

在你的viewWillDisappear方法中检查

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ([self isMovingFromParentViewController]) { //specific stuff for being popped off stack } } 

这仅适用于iOS 5以后的版本

UINavigationController有一个派发委托callback的delegate属性。 请参阅这里的iOS参考 。

委托没有“后退button”callback,但它会告诉你什么时候会出现在导航堆栈上。 当您按下后,您将顶视图控制器“popup”堆栈,所以它会告诉您视图即将出现。 我认为这是你要找的callback。

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

这是一个稍微不同的情况,但我认为解决scheme可能会帮助其他人。

在我的情况下,我有一个UIPopoverController内的UINavigationController。 我需要检测用户是否单击了后退button,或者在popup窗口之外单击。 为此,我在viewWillDisappear中检查了visibleViewController属性。 如果视图控制器在closures时仍然是visibleViewController,那么弹窗被另一种方法closures。 如果视图控制器在closures时不是visibleViewController,则按下后退button。

 - (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的解决scheme,但是对于这两种情况,isMovingFromParentViewController都返回true。

我validation了这个在iOS 5+中的作品

我希望这有帮助。

创build一个自定义后台button并设置目标,

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

 - (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; } 

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

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

干杯!

为了完整起见,在Swift中混合了两个最重要的答案( 1,2 ):

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