在我切换选项卡之前,viewWillAppear 不会为属于 UITabBarController 的 UIViewController 触发
Posted
技术标签:
【中文标题】在我切换选项卡之前,viewWillAppear 不会为属于 UITabBarController 的 UIViewController 触发【英文标题】:viewWillAppear not firing for UIViewController that belongs to UITabBarController until I switch tabs 【发布时间】:2016-09-10 00:43:41 【问题描述】:在我的 ios 应用程序中,我有一个 UITabBarController
,它的 viewControllers
列表看起来像 [vc1, vc2]
,它们分别属于 MyVC1
和 MyVC2
类,它们都是 UIViewController
的子类。 MyVC1
覆盖 viewWillAppear
,覆盖的版本会打印一些东西,所以我知道它什么时候被调用。 (这是为了隔离我遇到的一个更大的问题,即视图没有出现。)
我的问题是,当应用程序第一次启动并且vc1
是选定的选项卡时,没有打印任何内容,这意味着它的viewWillAppear
没有被调用。如果我切换选项卡然后返回到vc1
,则确实会打印一些内容,因此在我从另一个选项卡切换回它之前不会调用vc1
的viewWillAppear
。
有什么方法可以让vc1
在应用程序启动后立即调用viewWillAppear
,而无需切换标签?老实说,我很惊讶这不是默认行为。
【问题讨论】:
【参考方案1】:我刚刚在 Xcode 中创建了一个新的测试应用程序,在 Main.storyboard 中只有一个 UITabViewController(及其两个子视图控制器),当我为第一个孩子覆盖 viewWillAppear 时,每次都会打印我的“视图将出现”日志(包括在应用启动时)。
以下是一些可能导致 viewWillAppear 无法被调用的情况:
-
在覆盖 viewWillAppear 的地方没有调用 super
在某处添加视图控制器的视图作为子视图,而不将视图控制器添加为子视图控制器
您还可以尝试查看是否为您的 UITabBarController 调用 viewWillAppear,如果没有,是为其父级或呈现视图控制器调用它吗?以此类推,直到您找到滞留的位置。
【讨论】:
谢谢,我覆盖了UITabBarController
的viewWillAppear
而没有在里面调用super.viewWillAppear
。愚蠢的错误......
我很欣赏这个答案。这是一件非常小的事情,通常我们会错过它。它节省了很多时间。谢谢【参考方案2】:
如果你有自定义 UITabBarController,检查 override func viewWillAppear is call super
在自定义UITabBarController中
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated) // this line need
【讨论】:
哦,我看到评论了。【参考方案3】:在 vc1 的 viewWillAppear 方法中使用以下行:
[super viewWillAppear:animated];
接下来,UITabBarController 必须是您的初始控制器。
【讨论】:
抱歉,这没有帮助。在我从另一个选项卡切换到vc1
之前,它仍然没有被调用。
你能贴一张你的故事板的截图吗?
感谢您的帮助。我的UITabBarController
中缺少对 super 的调用。
如果 UITabBarController 不是我的初始控制器,我该怎么办?【参考方案4】:
在 viewwillapear 中的 UITabBarController 中使 shure 有 super.viewWillAppear(animated) 像下面的代码
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
【讨论】:
以上是关于在我切换选项卡之前,viewWillAppear 不会为属于 UITabBarController 的 UIViewController 触发的主要内容,如果未能解决你的问题,请参考以下文章