我正在构建一个应用程序,如果用户登录,则必须更改其根视图控制器。如果用户登录,则我必须将标签栏控制器显示为主屏幕(如果用户未登录),则必须显示身份验证控制器。我的两个控制器都是情节提要控制器。现在在我的应用程序委托中,我输入了以下代码
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()
按照如果用户登录的代码,TabController必须showed.But它是不是被shown.I试图调试TabController的viewDidLoad被称为但是我的authenticationController正在显示那可能是因为authenticationController被设置为初始视图- 控制在故事板。有人可以帮我解决这个问题吗
TabController
viewDidLoad
authenticationController
如果您仅定位iOS 13+,则只需要做的更改就是添加一行:
iOS 13+
window?.rootViewController = initialViewController // add this line self.window = window window?.makeKeyAndVisible()
如果要支持早期的iOS版本,请使用完整的SceneDelegate / AppDelegate实现:
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>) { } }