iOS 13: Swift - 'Set application root view controller programmatically' does not work

后端 未结 14 1073
北恋
北恋 2020-12-01 01:43

I have following code in my AppDelegate.swift to setup root view controller for an iOS application. But it does not work. It follows Target structure (defined under General

14条回答
  •  再見小時候
    2020-12-01 02:27

    I tried following two options and both of these working for me. With iOS-13 (Xcode 11) a new file SceneDelegate.swift with the concept of UIWindowScene is enabled by default.

    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
        var window: UIWindow?
    
    
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
            guard let windowScene = (scene as? UIWindowScene) else { return }
    
    
            self.window = UIWindow(windowScene: windowScene)
            //self.window =  UIWindow(frame: UIScreen.main.bounds)
    
            let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
            guard let rootVC = storyboard?.instantiateViewController(identifier: "ViewControllerIdentifierName") as? ViewController else {
                print("ViewController not found")
                return
            }
            let rootNC = UINavigationController(rootViewController: rootVC)
            self.window?.rootViewController = rootNC
            self.window?.makeKeyAndVisible()
        }
    }
    

    Alternate:

    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
        var window: UIWindow?
    
    
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            let windowScene = UIWindowScene(session: session, connectionOptions: connectionOptions)
            self.window = UIWindow(windowScene: windowScene)
            //self.window =  UIWindow(frame: UIScreen.main.bounds)
            let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
            guard let rootVC = storyboard?.instantiateViewController(identifier: "ViewControllerIdentifierName") as? ViewController else {
                print("ViewController not found")
                return
            }
            let rootNC = UINavigationController(rootViewController: rootVC)
            self.window?.rootViewController = rootNC
            self.window?.makeKeyAndVisible()
    
        }
    }
    

    I don't know, why and how it works but it resolved my problem.

    Reference docs that helped me:

    • init(windowScene:)
    • UIWindow
    • rootViewController

提交回复
热议问题