如何正确处理nil UIApplication.sharedApplication().keyWindow

AsT*_*TeR 6 cocoa-touch objective-c ios swift

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

但是我总是UIApplication.sharedApplication().keyWindow因为没事而崩溃......

一旦加载了视图,我应该把我的代码放在哪里调用它而不是每次用户都回来时(我已经排除了viewWillAppear)?

dan*_*ndi 15

情况1: - UIWindow在App的代表中手动创建

在将其设置为键之前,您可能以某种方式添加了UIViewControllera UIWindow.

您应该window.makeKeyAndVisible()在创建窗口后调用应用程序的委托.

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

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

所发生的是系统不能只将窗口设置在前面并将视图控制器设置到其上,因为它是第一个视图控制器,而不是推送/弹出导航控制器.并且viewDidLoad可能需要一些时间......所以Default.png它同时显示,直到视图控制器准备就绪.

然后它viewDidAppear会在实际出现时调用.这就是你应该能够访问的地方keyWindow

情况3:

你有一个奇怪的情况,你有窗户,但目前没有一个是"关键"窗口,但你迫切需要访问窗口.

打电话UIApplication.sharedApplication().windows,看看它是不是空的并采取第一个元素.UIApplication.sharedApplication().delegate?.window可能也有一个值,但通常只有当窗口已经是键时.

  • 在`viewDidAppear`中进行调用(而不是`viewWillAppear`)为我修复了类似的问题. (2认同)