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.
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() }