Is it possible to access window variable from SceneDelegate in a ViewController? Basically I need an alternative for this UIApplication.shared.delegate.window but can't find anything
            Asked
            
        
        
            Active
            
        
            Viewed 1.2k times
        
    13
            
            
        
        kironet
        
- 766
 - 2
 - 11
 - 27
 
- 
                    2You don't need the scene (or app) delegate to get the window. From a view controller, do `self.view.window`. – rmaddy Oct 24 '19 at 20:11
 
1 Answers
27
            Updated
From iOS 13, apps can have multiple active windows, so you need to access the window you want. So you can access a window of any View like this:
self.view.window
if you really want to access the UISceneDelegate you can access it like:
self.view.window.windowScene.delegate
Old: and NOT recommended:
Assuming
- there is only one scene delegate.
 - There is only one scene and one window.
 - All view controllers in the app are all part of that one scene and its window.
 
You can implement a helper variable in SceneDelegate like this:
private(set) static var shared: SceneDelegate?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }
    Self.shared = self
}
then you can access it anywhere like this:
SceneDelegate.shared?.window // or anything else
        Community
        
- 1
 - 1
 
        Mojtaba Hosseini
        
- 95,414
 - 31
 - 268
 - 278
 
- 
                    2`SceneDelegate.shared?.window` it's cool only if you have only ONE scene which is not natural for scenes – imike Apr 05 '20 at 14:43