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

标签 ios objective-c swift cocoa-touch

viewDidLoad 被调用时, View 应该被加载。

但我总是在 UIApplication.sharedApplication().keyWindow 为 nil 时崩溃...

我应该把我的代码放在哪里,以便在加载 View 后调用它,而不是每次用户返回时调用它(出于这个原因,我已经排除了 viewWillAppear)?

最佳答案

情况 1: - 在 App 的委托(delegate)中手动创建 UIWindow

在将其设置为键之前,您可能以某种方式将 UIViewController 添加到 UIWindow 中。

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

情况 2: - 自动 Storyboard实例化

系统读取您的 Storyboard,初始化 Root View Controller ,通过调用 viewDidLoadviewWillAppear 进行准备,将其添加到窗口并显示窗口。

发生的事情是系统不能只是将窗口设置在前面并将 View Controller 动画化到它上面,因为它是第一个 View Controller 并且您不是推/弹出导航 Controller 。 viewDidLoad 可能需要一些时间...因此 Default.png 会同时显示,直到 View Controller 准备就绪。

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

的地方

情况三:

您处于一种奇怪的情况,您有窗口,但目前没有一个是“关键”窗口,但您迫切需要访问该窗口。

调用UIApplication.sharedApplication().windows,看是否不为空,取第一个元素。 UIApplication.sharedApplication().delegate?.window 也可能有一个值,但通常只有当窗口已经是 key 时才会有。

关于ios - 如何正确处理 nil UIApplication.sharedApplication().keyWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324660/

相关文章:

ios - 获取元素的当前约束

ios - 是否可以将旧的 xcode 代码更新为最新的 xcode?

objective-c - 为什么 AVAssetExportSession 会产生一个空文件?

ios - 如何在 WKWebView 中 t.co 重定向后获取最终 URL

ios - 从 SDK 更改 appdelegate 方法

swift - 使用 AVFoundation 在 Swift 中录制视频时如何删除临时文件?

ios - SwiftUI 的 onAppear() 和 onDisappear() 在 Xcode 12.1 上多次调用且不一致

iphone - iOS棋盘游戏架​​构

android - React native——我应该使用异步存储还是 cookie?

ios - 我的应用程序在调试版本中运行良好,仅在使用 AFNewtworking 3.0 的以下方法时在发布版本中崩溃