UINavigationController和viewWillDisappear

时间:2010-11-01 19:04:35

标签: iphone objective-c ipad ios

所以我在我的应用程序中有一个UINavController,并且当用户按下后退按钮时我正在尝试执行一个方法。我到处搜寻,只能找到一些在上下文中没有意义的点点滴滴。

当用户按下后退按钮以关闭当前视图时,是否有办法实现某种检查? (弹出视图的viewWillDisappear方法由于某种原因永远不会被调用。我确实读过它,除非你转发那个电话吗?)听起来是否合适,是否有人有任何想法或建议?提前谢谢。

5 个答案:

答案 0 :(得分:6)

看看UINavigationControllerDelegate。当UIViewController被推送到导航控制器堆栈时,只有两种方法被调用。同样,如果正在推送一个,那么可能只是弹出了一些东西。这就是我所做的调用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];   
}

此代码保持对最后一个被推送的视图控制器的指针引用,这样一旦我们推送另一个,我们就可以弹出最后一个(如果它仍然存在)。

答案 1 :(得分:2)

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

因此,在添加UINavigationController的视图时,请务必手动将这些消息发送给它。

UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController];

[navigationController viewWillAppear:NO];
[aView addSubview:navigationController.view];
[navigationController viewDidAppear:NO];

至少,这是我在开发过程中发现的。一直在寻找这个,我仍然不明白它背后的理由。

答案 2 :(得分:0)

您可以随时隐藏默认的后退导航按钮,并使用自己的方法创建自己的按钮,以便在按下时调用。

执行您想要的任何代码,然后弹出视图。

答案 3 :(得分:0)

我使用了这个解决方案:

  • 在导航栏左侧添加自定义按钮
  • 让该按钮激活自定义方法。

此解决方法的缺点:您将丢失那个漂亮的箭头形状的“后退”按钮。这也可以通过自定义图像解决。

所以这是我的代码。 把它放在你的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;

答案 4 :(得分:-1)

viewWillDisappear&弹出或关闭控制器时会调用viewDidDisappear。该函数在前端视图控制器上调用,而不是在UINavigationController本身上调用。您是否可能继承并忘记给超级电话打电话?