UINavigationController和viewWillDisappear

所以我在我的应用程序中有一个UINavController,并试图在用户按下后退button时执行一个方法。 我到处search,只能find那些在上下文中没有意义的零碎。

有没有一种方法可以实现某种检查,当用户按下后退button来closures当前视图时会捕获这种检查? (viewWillDisappear方法的视图被popup从来没有得到要求,因为某些原因,我读过,除非你转发这个电话它不),这听起来是正确的,有没有人有任何想法或build议? 提前致谢。

AFAIK,如果你通过代码添加一个UINavigationController给UIView,默认情况下它不会把这些消息发送给它的子视图。 它只会在UINavigationController本身接收到这些调用时执行此操作。 也许这是你的问题(我不知道你的视图设置)。

所以,在添加UINavigationController的视图时,一定要手动发送这些消息。

UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController]; [navigationController viewWillAppear:NO]; [aView addSubview:navigationController.view]; [navigationController viewDidAppear:NO]; 

至less,这是我在开发过程中发现的。 一直在寻找这个很长的时间,我仍然不明白其背后的理由。

看看UINavigationControllerDelegate 。 当UIViewController被推送到导航控制器堆栈时,只有两个方法被调用。 同样,如果有人被推,那么可能只是popup一些东西。 这是我所做的调用viewDidDisappear和viewWillDisappear。

 # pragma mark - UINavigationControllerDelegate Methods - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { static UIViewController *vcPointer = nil; // If the previous view controller is still around then let's send a viewWillDisappear message if (vcPointer != nil) { if ([vcPointer respondsToSelector:@selector(viewWillDisappear:)]) { [vcPointer viewWillDisappear:animated]; } } // Keep track of a pointer to the current viewController vcPointer = viewController; [viewController viewWillAppear:animated]; } 

这段代码保留了一个指向最后一个视图控制器的指针,这样一旦我们推动另一个视图控制器,我们就可以popup最后一个(如果它仍然存在的话)。

您可以随时隐藏默认的导航button,并在按下时调用自己的方法来创build自己的方法。

执行你想要的任何代码,然后popup视图。

我使用这个解决scheme:

  • 在导航栏的左侧添加一个自定义button
  • 让那个button激活一个自定义的方法。

这个解决方法的缺点:你会失去那个很好的箭头形状的“后退”button。 这可以通过自定义图像来解决。

所以这里是我的代码。 把它放在你的viewDidLoad中:

 // LeftButton in Navigation Bar UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPushed:)]; self.navigationItem.leftBarButtonItem = leftBarButton; [leftBarButton release]; 

然后在同一个.m文件中添加这个方法:

 - (void) backButtonPushed: (id)sender { // do what you want to do } 

不要忘记在.h文件中

 - (void) backButtonPushed: (id)sender; 

viewWillDisappear&viewDidDisappear在控制器popup或解除时被调用。 该函数在前端视图控制器上调用,而不是在UINavigationController本身上调用。 你有没有可能inheritance和忘记调用超级的东西?