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

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


To choose a previous approach to the one supported by SwiftUI, from a project created in Xcode 11, you can follow these steps.

Steps for get old aproach


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:


I tried the following approach and it's working for me in iOS 13 and also tested on iOS 12.4.2 from Xcode 11.

func resetRoot() {            guard let rootVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController") as? ViewController else {                return            }            let navigationController = UINavigationController(rootViewController: rootVC)            UIApplication.shared.windows.first?.rootViewController = navigationController            UIApplication.shared.windows.first?.makeKeyAndVisible()     }