IOS | Unable to change root view controller in app delegate

元气小坏坏 提交于 2020-06-06 08:24:22

问题


I am building an app whose root view controller must be changed if the user is logged in. Say if the user is logged in I must show a tab bar controller as the home screen if the user is not logged in, I must show an Authentication controller. Both my controllers are storyboard controllers. Now in my app delegate, I have put the following code

        window = UIWindow(frame: UIScreen.main.bounds)

        if UserDefaults.standard.bool(forKey: Constants.UserDefaultsKeys.isLoggedIn){
            initialViewController = storyboard.instantiateViewController(identifier: Constants.StoryBoards.homeViewController) as! TabController
        }else{
            initialViewController = storyboard.instantiateViewController(identifier: Constants.StoryBoards.authenticationController)
        }
        window?.rootViewController = initialViewController
        window?.makeKeyAndVisible()

As per the code if the user is logged in ,TabController must be showed.But it is not being shown.I have tried debugging and TabController's viewDidLoad is being called but still my authenticationController is being shown and that is probably because authenticationController is set as the initial viewcontroller in the storyboard. Can someone help me figure out the issue


回答1:


If you are targeting only iOS 13+, the only change you should need to make is to add one line:

    window?.rootViewController = initialViewController

    // add this line
    self.window = window

    window?.makeKeyAndVisible()

If you want to support earlier iOS versions, here is a complete SceneDelegate / AppDelegate implementation:

SceneDelegate.swift

//
//  SceneDelegate.swift
//  Created by Don Mag on 3/27/20.
//

import UIKit

// entire class is iOS 13+
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

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

        print("Scene Delegate willConnectTo", UserDefaults.standard.bool(forKey: "isLoggedIn"))

        guard let windowScene = (scene as? UIWindowScene) else { return }
        let window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window.windowScene = windowScene

        if UserDefaults.standard.bool(forKey: "isLoggedIn") {
            guard let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeVC") as? TabController else {
                fatalError("Could not instantiate HomeVC!")
            }
            window.rootViewController = vc
        } else {
            guard let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AuthVC") as? AuthViewController else {
                fatalError("Could not instantiate HomeVC!")
            }
            window.rootViewController = vc
        }

        self.window = window

        window.makeKeyAndVisible()
    }

}

AppDelegate.swift

//
//  AppDelegate.swift
//  Created by Don Mag on 3/27/20.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window : UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {
            if #available(iOS 13, *) {
                // do only pure app launch stuff, not interface stuff
            } else {

                print("App Delegate didFinishLaunching... isLoggedIn:", UserDefaults.standard.bool(forKey: "isLoggedIn"))

                self.window = UIWindow()

                if UserDefaults.standard.bool(forKey: "isLoggedIn") {
                    guard let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeVC") as? TabController else {
                        fatalError("Could not instantiate HomeVC!")
                    }
                    window?.rootViewController = vc
                } else {
                    guard let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "AuthVC") as? AuthViewController else {
                        fatalError("Could not instantiate HomeVC!")
                    }
                    window?.rootViewController = vc
                }

                window?.makeKeyAndVisible()

            }
            return true
    }

    // MARK: UISceneSession Lifecycle

    // iOS 13+ only
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
    // iOS 13+ only
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }

}


来源:https://stackoverflow.com/questions/61291306/ios-unable-to-change-root-view-controller-in-app-delegate

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