Set rootViewController iOS 13

好久不见. 提交于 2019-12-01 06:44:54

问题


After upgrading Xcode a critical part of my application has stopped working.

When my app launches I run a function to check boolean flags and set the correct rootViewController.

But the code I have been using to set this has now stopped working

class func setLoginAsInitialViewContoller(window:UIWindow) {
    print("SET LOGIN") 
    let storyboard = UIStoryboard(name: "Login", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "LoginViewController")
    controller.modalPresentationStyle = .overFullScreen
    window.rootViewController = controller
    window.makeKeyAndVisible()
}

Specifically when the app gets the the second last line window.rootViewController = controller it crashes with a libc++abi.dylib: terminating with uncaught exception of type NSException error.

The above function is in a class called Utilities.swift and I am calling the function from within my AppDelegate.swift as shown below:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var storyboard: UIStoryboard? = nil

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.isIdleTimerDisabled = true
        Utilities.decideInitialViewController(window: self.window!)

        return true
    }

Any solutions or fixes on how I can set the root controller is much appreciated.

Thank!


回答1:


This is because AppDelegate.swift doesn't have window property anymore. Now you must use SceneDelegate.swift to change root view controller. Like shown in this example: Accessing the Root View Controller at Launch on iOS 13 with SceneDelegate




回答2:


It is available in SceneDelegate.swift file in your project

It will have delegate method :

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)

Example

func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
 options connectionOptions: UIScene.ConnectionOptions) {



if let windowScene = scene as? UIWindowScene {

self.window = UIWindow(windowScene: windowScene) 

let initialViewController = 
    storyboard.instantiateViewController(withIdentifier: "FirstViewController")            
    self.window!.rootViewController = initialViewController
    self.window!.makeKeyAndVisible()
    }



}


来源:https://stackoverflow.com/questions/58082743/set-rootviewcontroller-ios-13

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!