You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过代码设置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管理窗口:

  1. 删除项目中的SceneDelegate.swift文件
  2. 打开Info.plist,删除Application Scene Manifest整个条目
  3. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:53:19