Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the keyWindow reference in a swift app?

Tags:

ios

swift

In Objective-C in the viewDidLoad method of a UIViewController I do this to get the keyWindow reference in my iOS app:

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

So, I am porting this view controller into Swift and I do this one the viewDidLoad call:

let window = UIApplication.sharedApplication().keyWindow

I am trying to understand why the window is nil. When I put a breakpoint right after that line I then inspect window in the console and I get this:

(lldb) po window
nil

How can I get window to be a valid reference to the keyWindow of my application in swift?

like image 360
zumzum Avatar asked Jun 14 '14 00:06

zumzum


4 Answers

I came to this question when I was searching for getting window in swift. If you want to get window instead of keyWindow, try this (Swift 2):

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

Updated for Swift 3: (Thanks @Trevor)

if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
    MBProgressHUD.show(text, view:window)
}
like image 105
superarts.org Avatar answered Oct 17 '22 15:10

superarts.org


Swift 4 simply has UIApplication.shared.keyWindow property, no casting necessary.

Note that iOS 13/iPadOS introduces UIScenes and explicit support for multiple windows, and thus deprecates the concept of keyWindow as it is no longer valid.

This question has an overview how to get access to scene based windows.

like image 25
juhan_h Avatar answered Oct 17 '22 17:10

juhan_h


Swift 5.1

Works for me

If you are also looking for a way to deal with foreground and background modes you should try this

UIApplication.shared.windows.first(where: { $0.isKeyWindow })
like image 12
nomnom Avatar answered Oct 17 '22 15:10

nomnom


Updating superarts.org's answer for Swift 3:

if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window { 
      MBProgressHUD.show(text, view: window)
}
like image 4
rmooney Avatar answered Oct 17 '22 15:10

rmooney