在展示ViewController时,我希望视图生命周期符合以下顺序:
-
viewDidLoad()
-
viewWillAppear
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewDidAppear()
注意:4到5之间可以是viewWill / viewDidLayoutSubviews()的更多迭代 . 换句话说,我希望viewDidLayoutSubview在第一个viewDidAppear之前触发 .
为了测试这个,我将一个childViewController添加到一个UIViewController子类,并调用addSubview来添加childViewController的视图 .
override func viewDidLoad() {
super.viewDidLoad()
let childVC = ChildViewController()
self.addChildViewController(childVC)
self.view.addSubview(childVC.view)
}
当我打印出视图方法时,这会产生预期的结果:
-
viewDidLoad()
-
viewWillAppear
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewDidAppear
当我在UIPageViewController子类上使用setViewController时:
override func viewDidLoad() {
super.viewDidLoad()
let childVC = ChildViewController()
self.setViewControllers([childVC], direction: .forward, animated: true, completion: nil)
}
我总是在第一个LayoutSubviews方法之前执行viewDidAppear:
-
viewDidLoad()
-
viewWillAppear
-
viewDidAppear
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
有人能解释为什么会出现这种情况吗
----进一步观察---
我还在childViewController的日志中添加了willMove和DidMove方法 . 初步测试的结果:
willMove(toParentViewController :)
-
viewDidLoad()
-
viewWillAppear
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewDidAppear
UIPageViewController的结果:
-
viewDidLoad()
-
viewWillAppear
-
viewDidAppear didMove(toParentViewController :)
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
-
viewWillLayoutSubviews()
-
viewDidLayoutSubviews()
所以看起来好像setViewController调用了moveToParentViewController,这可能是它之前调用viewDidAppear的原因 .