点击 UITabBar 时未调用子视图控制器的 viewDidDisappear
Posted
技术标签:
【中文标题】点击 UITabBar 时未调用子视图控制器的 viewDidDisappear【英文标题】:viewDidDisappear of child view controllers not called when tap on UITabBar 【发布时间】:2015-12-09 04:48:52 【问题描述】:我有一个附有UITabBarController
和一些UINavigationViewController
s 的应用程序。假设在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的主要内容,如果未能解决你的问题,请参考以下文章