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

后端 未结 14 1061
北恋
北恋 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:41

    Here's what work for both iOS 13.x and iOS 12.x and below

    For iOS 13,In the Scene Delegate

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
                guard let windowScene = (scene as? UIWindowScene) else { return }
                self.window = UIWindow(frame: windowScene.coordinateSpace.bounds)
               //Make sure to do this else you won't get 
               //the windowScene object using UIApplication.shared.connectedScenes
                self.window?.windowScene = windowScene 
                let storyBoard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
                window?.rootViewController = storyBoard.instantiateInitialViewController()
                window?.makeKeyAndVisible()
            }
    

    In a utility class, I wrote below function to get the window object and assign it to the appdelegate.window. According to my needs, I needed to set root view controller at multiple places in different scenarios for which I needed the window object.

    static func redirectToMainNavRVC(currentVC: UIViewController){
            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let vc = UIStoryboard(name: appDelegate.storyBoardName, bundle: nil).instantiateViewController(withIdentifier: "MainNavigationViewController") as! MainNavigationViewController
        if #available(iOS 13.0, *){
            if let scene = UIApplication.shared.connectedScenes.first{
                guard let windowScene = (scene as? UIWindowScene) else { return }
                print(">>> windowScene: \(windowScene)")
                let window: UIWindow = UIWindow(frame: windowScene.coordinateSpace.bounds)
                window.windowScene = windowScene //Make sure to do this
                window.rootViewController = vc
                window.makeKeyAndVisible()
                appDelegate.window = window
            }
        } else {
            appDelegate.window?.rootViewController = vc
            appDelegate.window?.makeKeyAndVisible()
        }
    }
    

    This worked well for me. Hopefully, it works for others too.

提交回复
热议问题