如何在Swift应用中获取keyWindow引用?

3wabscal  于 12个月前  发布在  Swift
关注(0)|答案(7)|浏览(164)

在UIViewController的viewDidLoad方法中,我这样做是为了在我的iOS应用程序中获取keyWindow引用:

UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];

字符串
因此,我将这个视图控制器移植到Swift中,并执行viewDidLoad调用:

let window = UIApplication.sharedApplication().keyWindow


我试图理解为什么窗口为nil。当我在该行后面放置一个断点时,我然后在控制台中检查窗口,我得到了这个:

(lldb) po window
nil


如何让window成为swift中我的应用程序的keyWindow的有效引用?

l7wslrjt

l7wslrjt1#

当我在Swift中搜索获取窗口时,我遇到了这个问题。如果你想获取窗口而不是keyWindow,试试这个(Swift 2):

if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate, let window = delegate.window {
    MBProgressHUD.show(text, view:window)
}

字符串
Swift 3更新:(感谢@特雷弗)

if let appDelegate = UIApplication.shared.delegate as? AppDelegate, let window = delegate.window {
    MBProgressHUD.show(text, view:window)
}

mwecs4sa

mwecs4sa2#

Swift 4只有UIApplication.shared.keyWindow属性,不需要强制转换。
请注意,iOS 13/iPadOS引入了UIScenes和对多个窗口的显式支持,因此不赞成keyWindow的概念,因为它不再有效。
This问题概述了如何访问基于场景的窗口。

f0ofjuux

f0ofjuux3#

Swift 5.1

为我工作
如果你也在寻找一种方法来处理foregroundbackground模式,你应该试试这个。

UIApplication.shared.windows.first(where: { $0.isKeyWindow })

字符串

11dmarpk

11dmarpk4#

更新superarts.org对Swift 3的回答:

if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window { 
      MBProgressHUD.show(text, view: window)
}

字符串

8gsdolmq

8gsdolmq5#

最简单的方法是:
在Objective-C中

[UIApplication sharedApplication].windows.firstObject

字符串
在Swift中

UIApplication.shared.windows.first!


请注意,只有当您不支持多个窗口时,这才有效。

edqdpe6u

edqdpe6u6#

在viewDidLoad的时候,关键窗口必须还没有被设置。你的代码在viewDidAppear中工作正常。或者,你可以在viewDidLoad中获取窗口数组,并从该数组中获取一个(如果有多个)窗口。

gpnt7bae

gpnt7bae7#

不要在didLoad函数中调用window在ViewController的viewDidAppear函数中调用keyWindow

相关问题