如何通过代码设置iOS应用初始视图控制器?登录跳转问题排查
问题排查与解决
原因分析
你的跳转逻辑未生效,核心原因是iOS 13+ 窗口管理逻辑变更:从iOS13开始,App不再通过AppDelegate管理窗口,而是由SceneDelegate负责场景(窗口)的创建与生命周期。你在AppDelegate中设置window的代码,在iOS13+系统上会被SceneDelegate的默认逻辑覆盖,导致无法切换页面。
另外还需排查两个细节:
- 确认
TabBarController在Storyboard中已设置正确的Storyboard ID(必须和代码里的"TabBarController"完全一致) - 验证
UserDefaults.standard.string(forKey: "userEmail")是否真的不为nil(可加日志确认)
解决方案
方案1:适配iOS13+(SceneDelegate场景)
如果你的项目启用了SceneDelegate(iOS13+新项目默认自带),将跳转逻辑移至SceneDelegate的scene(_:willConnectTo:options:)方法:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } FirebaseApp.configure() let db = Firestore.firestore() let window = UIWindow(windowScene: windowScene) self.window = window let storyboard = UIStoryboard(name: "Main", bundle: nil) let initialVC: UIViewController // 校验登录状态 if UserDefaults.standard.string(forKey: "userEmail") != nil { // 已登录,跳转主页面 let tabBarVC = storyboard.instantiateViewController(withIdentifier: "TabBarController") initialVC = UINavigationController(rootViewController: tabBarVC) } else { // 未登录,显示Storyboard默认初始页面 initialVC = storyboard.instantiateInitialViewController()! } window.rootViewController = initialVC window.makeKeyAndVisible() }
方案2:禁用SceneDelegate(仅适配iOS12及以下)
若项目只需支持iOS12及以下,或想强制用AppDelegate管理窗口:
- 删除项目中的
SceneDelegate.swift文件 - 打开
Info.plist,删除Application Scene Manifest整个条目 - 修改
AppDelegate代码,确保window初始化逻辑覆盖Storyboard默认设置:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() let db = Firestore.firestore() // 初始化窗口,覆盖Storyboard默认窗口 self.window = UIWindow(frame: UIScreen.main.bounds) let storyboard = UIStoryboard(name: "Main", bundle: nil) let initialVC: UIViewController if UserDefaults.standard.string(forKey: "userEmail") != nil { let tabBarVC = storyboard.instantiateViewController(withIdentifier: "TabBarController") initialVC = UINavigationController(rootViewController: tabBarVC) } else { initialVC = storyboard.instantiateInitialViewController()! } self.window?.rootViewController = initialVC self.window?.makeKeyAndVisible() return true }
额外校验步骤
- 打开Main.storyboard,选中
TabBarController,在右侧Identity Inspector面板中确认Storyboard ID设置为TabBarController - 新增日志验证登录状态:
运行后查看控制台输出,确认是否触发了登录跳转逻辑let userEmail = UserDefaults.standard.string(forKey: "userEmail") print("当前用户状态:\(userEmail == nil ? "未登录" : "已登录,邮箱:\(userEmail!)")")
内容的提问来源于stack exchange,提问作者codingcoder
相关产品推荐
相关产品推荐

