我最近对iOS视图控制器的容纳感到头疼。

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

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

  • 这种边缘情况可能会出现例如如果由于异步网络调用而创建并包含子VC,则该子VC可能位于父级的viewWillAppear和viewDidAppear之间。

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

    要在本地重现此内容,请在Xcode中创建一个新的“Single View Application” iOS项目,然后用上述要点替换ViewController.swift的内容。

    我是否在这里缺少明显的东西,或者这是Apple的错误?

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

    最佳答案

    后续:这是我当前正在使用的解决方法:https://gist.github.com/cellularmitosis/56d734ab087a3f283455

    我实现了一个视图控制器过渡状态跟踪器,并且如果父VC在viewWillAppear和viewDidAppear之间,那么我们对shouldAutomaticallyForwardAppearanceMethods回答为false。

    containsChildViewController已更新,以应对shouldAutomaticallyForwardAppearanceMethods的true和false。

    绝对是个麻烦,但它似乎起作用。

    待办事项:在viewWillDisappear-> viewDidDisappear过渡期间可能存在类似的错误。我还没检查

    编辑:编辑了解决方法要点,以使用beginAppearanceTransition / endAppearanceTransition代替直接调用viewWillAppear / viewDidAppear

    关于ios - 如果父级位于viewWillAppear和viewDidAppear之间,则不会在包含的VC上调用viewWillAppear,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33681308/

    10-12 23:53