如何捕捉后退button事件

我有一个UITableViewController启动一个UIViewController,我想陷阱,只要按下后退button的子控制器,这是从'UIViewController'派生的类。 我可以更改后退button标题,但设置backBarButtonItem时设置目标和操作值似乎被忽略。 接收某种Backbutton被点击的通知的方法是什么?

- (void)showDetailView { // How I'm creating & showing the detail controller MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyDetailView" bundle:nil]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Pages" style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack:)]; self.navigationItem.backBarButtonItem = backButton; [backButton release]; [self.navigationController pushViewController:controller animated:animated]; [controller release]; } - (void)handleBack:(id)sender { // not reaching here NSLog(@"handleBack event reached"); } 

你可以实现UIViewController的viewWillDisappear方法。 当你的控制器即将离开时(或者是因为另一个被推到导航控制器堆栈上,或者因为按下了“后退”button),这会被调用。

要确定视图是否因按下后退button而消失,您可以使用自定义标志,无论您将新控制器推到导航控制器上,您都可以设置该标志,如下所示

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (viewPushed) { viewPushed = NO; // Flag indicates that view disappeared because we pushed another controller onto the navigation controller, we acknowledge it here } else { // Here, you know that back button was pressed } } 

无论你在哪里推新的视图控制器,你都必须记住设置该标志。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... viewPushed = YES; [self.navigationController pushViewController:myNewController animated:YES]; ... } 

这个问题已经有一段时间了,但我只是试图自己做这个。 我使用类似于卓然的解决scheme,但不是使用国旗我做到了这一点:

 - (void)viewWillDisappear: (BOOL)animated { [super viewWillDisappear: animated]; if (![[self.navigationController viewControllers] containsObject: self]) { // the view has been removed from the navigation stack, back is probably the cause // this will be slow with a large stack however. } } 

我认为它绕过了旗帜的问题,国际海事组织是干净的,但不如效率(如果在导航控制器上有很多项目)。

在我看来是最好的解决scheme。

 - (void)didMoveToParentViewController:(UIViewController *)parent { if (![parent isEqual:self.parentViewController]) { NSLog(@"Back pressed"); } } 

但它只适用于iOS5 +

我使用这个代码:

 - (void) viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) { // your view controller already out of the stack, it meens user pressed Back button } } 

但是,当用户按下标签栏button并且一步跳到根视图控制器时,这不是实际的。 对于这种情况使用这个:

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewControllerChange:) name:@"UINavigationControllerWillShowViewControllerNotification" object:self.navigationController]; - (void) viewControllerChange:(NSNotification*)notification { NSDictionary* userInfo = [notification userInfo]; if ([[userInfo objectForKey:@"UINavigationControllerNextVisibleViewController"] isKindOfClass:[<YourRootControllerClass> class]]) { // do your staff here } } 

不要忘了:

  [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UINavigationControllerWillShowViewControllerNotification" object:self.navigationController]; 

您可以制作自己的button并将其作为leftBarButtonItem 。 然后让它调用你的方法,你可以做任何事情,并调用[self.navigationController popViewController...自己

 { UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack:)]; self.navigationItem.leftBarButtonItem = backButton; [backButton release]; [self filldata]; [super viewDidLoad]; } 

leftBarButtonItemreplaceleftBarButtonItem

只需使用viewDidDisappear 。 在任何情况下都会被完美的调用。

我们将您的生命周期pipe理基于viewDidAppear和viewDidDisappear。 如果你知道Android:两者都可以比较onResume和onPause方法。 但是在locking屏幕或按下iOS上的homebutton时有所不同。