如何正确处理一个无UIApplication.sharedApplication().keyWindow

viewDidLoad被调用时,视图应该被加载。

但是我总是在UIApplication.sharedApplication().keyWindow崩溃UIApplication.sharedApplication().keyWindow是零…

我应该把我的代码放在视图被加载时调用它,而不是每次用户回来(我已经排除viewWillAppear出于这个原因)?

情况1: – 在应用程序委托中创build手动UIWindow

您可能以某种方式将UIViewController添加到UIWindow然后再将其设置为键。

创build窗口后,应该在应用程序的委托中调用window.makeKeyAndVisible()

情况2: – 自动故事板实例化

系统读取故事板,初始化根视图控制器,通过调用viewDidLoadviewWillAppear准备它,将其添加到窗口并显示窗口。

会发生什么事是系统不能把窗口设置在前面,并将视图控制器设置到它上面,因为它是第一个视图控制器,而不是导航控制器的推入/popup。 而viewDidLoad可能需要一些时间…所以Default.png正在显示,直到视图控制器准备就绪。

然后它调用viewDidAppear ,当它实际出现时。 所以这就是你应该能够访问keyWindow

情况3:

你有一个奇怪的情况,你有窗户,但他们当前都不是“钥匙”窗口,但是你迫切需要访问窗口。

调用UIApplication.sharedApplication().windows ,看看它是不是空的,并采取第一个元素。 UIApplication.sharedApplication().delegate?.window也可能有一个值,但通常只有当该窗口已经是密钥的时候

尝试使用应用程序委托的window属性:

 UIApplication.sharedApplication().delegate!.window