UINavigationController and viewWillDisappear

3

我在我的应用程序中有一个UINavController,并试图在用户按下返回按钮时执行一个方法。 我已经搜索了所有地方,只能找到一些不太合理的碎片。

是否有一种实现某种检查的方法,以捕获当用户按下返回按钮以关闭当前视图时的情况? (对于要弹出的视图,viewWillDisappear方法永远不会被调用,原因是什么我不知道。我确实读过,除非您转发该调用?)这听起来正确吗? 有人有什么想法或建议吗? 提前致谢。

5个回答

6

看一下UINavigationControllerDelegate。当一个UIViewController被推到导航控制器栈时,只有两个方法会被调用。同样地,如果有一个视图控制器正在被推送,那么可能刚刚有一个视图控制器被弹出了。这就是我调用viewDidDisappearviewWillDisappear的方法。

# 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];   
}

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

2
据我所知,如果您通过代码将UINavigationController添加到UIView中,则默认情况下它不会将这些消息发送给其子视图。只有当UINavigationController本身接收到这些调用时才会执行此操作。也许这就是您的问题(我不知道您的视图设置)。
因此,在添加UINavigationController的视图时,请确保手动发送这些消息。
UINavigationController *navigationController = [UINavigationController alloc] initWithRootViewController:rootViewController];

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

至少在开发过程中,这是我发现的。我已经寻找了很长时间,但我仍然不明白背后的原理。


是的,我也觉得可能是这样,我会尝试一下并告诉你是否正确。 - gabaum10
我检查了一下,对我来说是可以工作的。有两个小修正,这一行 [navigationController viewWillAppear:NO]; 应该放在 addView 方法之后。而且我认为 viewDidAppear 方法是不必要的。 - Di Wu
1
但“will”事件的整个意义在于它发生在您执行操作之前,因此我认为您的更正是无效的。 - jszumski

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;

0

您可以随时隐藏默认的返回导航按钮,并创建自己的按钮,当按下时调用其自己的方法。

在那里执行任何代码,然后弹出视图。


我并不需要明确地更改功能,因为它已经完美地工作了。我只需要在导航控制器中的某个视图弹出时执行一个方法... - gabaum10

-1

当控制器被弹出或解散时,将调用viewWillDisappear和viewDidDisappear函数。该函数在前台视图控制器上调用,而不是在UINavigationController本身上调用。您可能会忘记在某些内容上调用超级子类化吗?


是的,我也这么想。但我读到的很多资料都说不一样的事情。 - gabaum10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接