当调用UIApplication.sharedApplication().keyWindow
时,应该加载视图。
但我总是在$scope.gridOptions = {
exporterMenuCsv: false,
enableGridMenu: true,
columnDefs: [
{ name: 'name' },
{ name: 'gender', enableHiding: false },
{ name: 'company' }
],
...
};
失败......
一旦加载了视图,我应该把代码放在哪里调用它而不是每次用户都回来时(因为这个原因我排除了viewWillAppear)?
答案 0 :(得分:15)
情况1: - 在App的代理人中创建手动UIWindow
在将其设置为密钥之前,您可能以某种方式向UIViewController
添加了UIWindow
。
创建窗口后,您应该在应用程序代理中调用window.makeKeyAndVisible()
。
情况2: - 自动故事板实例化
系统会读取您的故事板,初始化根视图控制器,通过调用viewDidLoad
和viewWillAppear
进行准备,将其添加到窗口并显示窗口。
系统不能只将窗口设置在前面并将视图控制器设置到其上,因为它是第一个视图控制器,而不是推送/弹出导航控制器。并且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
}
}
}