在启动期间将UIViewController设置为UIWindow的根时未调用viewWillAppear和更高版本的生命周期事件

The*_*eoK 2 ios swift

我在下面的一段代码application(_:didFinishLaunchingWithOptions:)方法

self.window = self.window ?? UIWindow()
self.window?.makeKeyAndVisible()
let mainViewController = HomeViewController.instantiate() //here I just call the viewController through storyboard, set some properties and return its instance
window?.rootViewController = mainViewController
Run Code Online (Sandbox Code Playgroud)

我检查了,viewController添加到的时候调用的唯一生命周期事件window是:

viewDidLoad
viewWillLayoutSubviews
viewDidLayoutSubviews
Run Code Online (Sandbox Code Playgroud)

之后的任何事情都不会被调用(只有在最初添加它window之后才会发生这种情况,之后事件被调用,因为它们应该被调用).安全布局指南也未设置(我相信其他视图属性也是如此).为了绕过此问题,我执行以下操作:

window?.rootViewController = UIViewController()
Run Code Online (Sandbox Code Playgroud)

然后

window?.rootViewController = mainViewController
Run Code Online (Sandbox Code Playgroud)

看起来这会以某种方式强制窗口在第二次设置根视图控制器时正常工作.

然而,似乎有一些我缺少的东西或存在某种生命周期问题.

有没有人遇到同样的问题并找到了根本原因?

Shu*_*ham 5

设置窗口的根视图控制器后,尝试在最后设置窗口键和Visible.

self.window = self.window ?? UIWindow()
let mainViewController = HomeViewController.instantiate()
window?.rootViewController = mainViewController
self.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)