如果父级在viewWillAppear和viewDidAppear之间,则不会调用包含VC的viewWillAppear

时间:2015-11-12 21:03:04

标签: ios swift

我最近遇到了iOS视图控制器遏制问题。

除了一个特殊情况外,一切都按预期工作:

  • 如果父级在其viewWillAppear和viewDidAppear调用之间包含子视图控制器,则viewWillAppear将永远不会发送到子VC(子VC看到viewDidLoad,然后是viewDidAppear)。

这种边缘情况可能出现,例如如果您创建并包含子VC作为异步网络调用的结果,该调用可能位于父视图的viewWillAppear和viewDidAppear之间。

我在这里放了一个演示:https://gist.github.com/cellularmitosis/8205610a80112eebd96c

要在本地重现,请在Xcode中创建一个新的“单视图应用程序”iOS项目,然后用上面的要点替换ViewController.swift的内容。

我是否遗漏了一些明显的东西,或者这是苹果公司的一个错误?

我猜这意味着我需要覆盖shouldAutomaticallyForwardAppearanceMethods()以返回false,然后手动调用beginAppearanceTransition和endAppearanceTransition?

1 个答案:

答案 0 :(得分:0)

跟进:这是我目前正在使用的解决方法:https://gist.github.com/cellularmitosis/56d734ab087a3f283455

我实现了一个视图控制器转换状态跟踪器,如果父VC位于viewWillAppear和viewDidAppear之间,那么我们对shouldAutomaticallyForwardAppearanceMethods回答false。

containsChildViewController已更新为处理shouldAutomaticallyForwardAppearanceMethods的true和false。

绝对是一个kludge,但似乎有效。

TODO:viewWillDisappear期间可能存在类似的错误 - > viewDidDisappear过渡。我没有检查过。

编辑:编辑了变通方法要点,使用beginAppearanceTransition / endAppearanceTransition而不是直接调用viewWillAppear / viewDidAppear