点击 UITabBar 时未调用子视图控制器的 viewDidDisappear

Posted

技术标签:

【中文标题】点击 UITabBar 时未调用子视图控制器的 viewDidDisappear【英文标题】:viewDidDisappear of child view controllers not called when tap on UITabBar 【发布时间】:2015-12-09 04:48:52 【问题描述】:

我有一个附有UITabBarController 和一些UINavigationViewControllers 的应用程序。假设在UITabBarController 的第一个选项卡上,用户导航到视图控制器 A,然后是 B,然后是 C,因此创建了一个堆栈 UINavigationController:A -> B -> C

我需要在 A、B 和 C 的 viewDidDisappear: 中做一些事情。如果用户点击后退按钮从 C -> B -> A 转到,则调用 B 和 C 的 viewDidDisappear:。但是如果用户点击UITabBarController中的第一个UITabBar,他们会直接从C -> A开始,并且只调用C的viewDidDisappear:,跳过B。

如果我使用我的自定义UITabBarController 子类并在tabBarController:shouldSelectViewController: 中返回NO,这种行为将不再存在,但我不想这样做,用户将不得不多次按下返回按钮才能去到根视图控制器。有什么办法可以解决这个问题,但要保持UITabBarController 的行为?

【问题讨论】:

您必须重新排列您的代码,使其不依赖于viewDidDisappear。该方法未被可靠地调用(即在您可能期望的每种情况下调用),这只是一个示例。顺便说一句,没有在 B 上调用它的原因是因为当您推送 C 时,B 的视图不在层次结构中。如果您自己弹出到根控制器,您会看到相同的行为。 【参考方案1】:

确保将底部栏保持为无(在视图控制器 B 和 C 中),如下所示。 这将从这些视图控制器中隐藏底部栏,并且用户将无法直接从 Viewcontroller C 导航到 Viewcontroller A。 用户需要使用后退按钮导航从 C 转到视图控制器 A。

这将解决您调用 viewDidDisappear 的问题。

【讨论】:

这正是不想要的答案。 Quote: ...这种行为将不复存在,但我不想这样做,用户将不得不多次按下返回按钮才能转到根视图控制器。 viewDidDisappear 方法的基本含义是当视图消失时调用。如果您不显示视图,您如何期望 ViewDidDisappear 被调用。它的 ios App 的基本生命周期。尽量不要过多依赖 viewDidDisappear。这会对你有帮助:)【参考方案2】:

b->c时viewDidDisappear方法已经被调用,c->a时该方法不能再调用一次b 在 a 或 c 中。希望能解决你的问题。

【讨论】:

以上是关于点击 UITabBar 时未调用子视图控制器的 viewDidDisappear的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在点击时选择的 UITabBar 视图

隐藏时未调用委托方法

单击提交时未调用Django视图功能

UIViewController 在 UITabBar 中执行的操作并切换回原始视图

在呈现模态视图时显示 UITabBar

用 UIToolBar 替换 UITabBar