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

时间:2015-07-09 17:44:11

标签: ios objective-c swift cocoa-touch

当调用UIApplication.sharedApplication().keyWindow时,应该加载视图。

但我总是在$scope.gridOptions = { exporterMenuCsv: false, enableGridMenu: true, columnDefs: [ { name: 'name' }, { name: 'gender', enableHiding: false }, { name: 'company' } ], ... }; 失败......

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

3 个答案:

答案 0 :(得分:15)

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

在将其设置为密钥之前,您可能以某种方式向UIViewController添加了UIWindow

创建窗口后,您应该在应用程序代理中调用window.makeKeyAndVisible()

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

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

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

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

的地方

情况3:

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

调用UIApplication.sharedApplication().windows,查看它是否为空并取第一个元素。 UIApplication.sharedApplication().delegate?.window也可能有值,但通常只有在窗口 key 时才会显示。

答案 1 :(得分:3)

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

UIApplication.sharedApplication().delegate!.window

答案 2 :(得分:-1)

如果从“ viewDidLoad”处的“ UIApplication.shared.keyWindow”中获得零,请尝试将代码包装在DispatchQueue中。

ex)

override func viewDidLoad() {
    DispatchQueue.main.async {
        if var window = UIApplication.shared.keyWindow {
            // do something
        }
    }
}
相关问题