2011-05-23 77 views
54

当视图加载时,我想看看是否因为用户按下了后退按钮。我该如何检查?找出用户是否按下了uinavigationcontroller中的后退按钮?

+2

你想知道它是否是一个用户发起弹出或一般大跌眼镜? – 2011-05-23 01:20:22

+0

阐述你的总体目标可能是件好事。可能有更简单的方法来做你想做的事情。例如,如果您需要知道某个值是否已更改或设置在第二个视图中,则应该只检查该值。 – 2011-05-23 01:53:37

+0

弹出是我想告诉的。 – Andrew 2011-05-23 02:01:12

回答

-7

做到这一点的唯一方法是确保它是后退按钮,这是为了创建一个自定义按钮。如果你不知道该怎么做,请查看tutorial。它看起来不像普通的后退按钮,但很接近。如果您需要更多帮助,请发表评论

+1

检查和其他答案,如果海报读取这个或许接受,作为正确的答案 – 2013-05-14 11:43:10

+0

@ user461864,你的意思是其他安德鲁,而不是安德鲁的其他答案 - 他们是不同的安德鲁斯。但你是对的,另一个答案是远远优于;目前的比较是一项额外的工作。 – JohnK 2013-06-02 01:20:37

+0

该死的你是对的,..我认为他回答了两次很奇怪,但这解释了 – 2013-06-19 20:40:08

7

UINavigationController具有发出委托回调的delegate属性。请参阅the iOS reference here

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

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

+1

没有委托显示何时uinavigationcontroller已经弹出堆栈 – Andrew 2011-05-23 01:43:05

+0

我说UINavigationController有一个委托。如果UINavigationController管理你的视图层次结构,它确实会回调委托,如果设置。 – makdad 2011-05-23 22:34:55

+0

我正在尝试这样做。备份时,不幸的是,它调用了“新的”视图控制器[备份] - viewWillAppear之前委托方法-navigationController:willShowViewContoller:animated:被调用相同的viewController ... – chadbag 2013-04-21 00:03:48

102

我发现检测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 
} 
+0

这很好用!但是你提到了iOS 5.0以前的版本。有没有可用于捕获后退按钮回调的iOS 5特定方法? – Keller 2012-08-14 21:21:14

+3

我已经更新了我在iOS 5.0中添加的新方法的答案。 – Andrew 2012-08-16 02:28:32

+4

当VC被推送时(至少在iOS 6上),这也会被调用。 – fabian789 2013-01-19 07:20:53

75

在viewWillDisappear方法检查

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

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

这仅是对后的iOS 5

+0

if语句中缺少括号,但否则非常有帮助的答案。谢谢! – AddisDev 2014-01-07 22:43:07

+2

作为一个替代方案,受Andrew的回答启发,您可以在移动之前通过覆盖 'willMoveToParentViewController:'而不是'didMoveToParentViewController:'来做一些事情。 – fatuhoku 2014-03-31 13:09:58

+0

此解决方案不起作用,除非在iOS 8中。 – 2015-01-21 08:46:57

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+验证这个工作

我希望这有助于。

1

创建自定义的回栏按钮和设置目标,

第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步:致电[自addBackBarButton] in viewDDL加载方法

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

干杯!

2

为了完整起见,在斯威夫特混合两种最upwoted答案(12)的:

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

不要使用'will',使用'did',因为屏幕边缘的弹出手势。 – SoftDesigner 2017-10-14 21:37:48

相关问题