如何在swift应用程序中获取keyWindow引用?

zum*_*zum 26 ios swift

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

 UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
Run Code Online (Sandbox Code Playgroud)

所以,我将这个视图控制器移植到Swift中,我在viewDidLoad调用中执行此操作:

let window = UIApplication.sharedApplication().keyWindow
Run Code Online (Sandbox Code Playgroud)

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

(lldb) po window
nil
Run Code Online (Sandbox Code Playgroud)

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

sup*_*org 35

当我在寻找快速获取窗口时,我遇到了这个问题.如果你想获得窗口而不是keyWindow,试试这个:

if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window {
    MBProgressHUD.show(text, view:window)
}
Run Code Online (Sandbox Code Playgroud)

针对Swift 3进行了更新:(感谢@Trevor)

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


juh*_*n_h 14

Swift 4只是拥有UIApplication.shared.keyWindow财产,不需要铸造.

  • iOS 13 中已弃用 `keyWindow` https://developer.apple.com/documentation/uikit/uiapplication/1622924-keywindow (5认同)

nom*_*nom 7

斯威夫特 5.1

为我工作

如果您也在寻找一种处理foregroundbackground模式的方法,您应该试试这个

UIApplication.shared.windows.first(where: { $0.isKeyWindow })
Run Code Online (Sandbox Code Playgroud)


rde*_*mar 3

viewDidLoad 时关键窗口尚未设置。您的代码在 viewDidAppear 中运行良好。或者,您可以在 viewDidLoad 中获取窗口数组,并从该数组中获取一个(如果有多个)窗口。