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

iOS开发:自动登录跳转视图控制器报警告且用户记忆功能失效

问题根因

  1. 视图跳转时机错误:你在ViewController的viewDidLoad方法中调用present接口,此时该控制器尚未被添加到应用的视图层级中,属于detached脱离状态,系统会触发警告,跳转逻辑也大概率失效。
  2. 分支逻辑写反:未登录的else分支中,你错误将根控制器设置为ViewController本身,会造成无限循环,无法进入正常流程。
  3. 登录状态校验冗余:Firebase Auth默认会持久化用户登录状态,不需要手动存uid到UserDefaults,直接校验Auth.auth().currentUser即可,可靠性更高。

修复代码

替换ViewController中viewDidLoad的逻辑

override func viewDidLoad() {
    super.viewDidLoad()
    setupElements()     
}

// 把自动登录判断放到viewDidAppear阶段,此时控制器已经挂载到视图层级
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // 优先用Firebase自带的登录状态判断,不需要读UserDefaults
    if Auth.auth().currentUser != nil {
        print("检测到已登录,跳转首页")
        // 如果需要包裹导航栏就用下面两行
        // let navController = UINavigationController(rootViewController: HomeViewController())
        // navController.navigationBar.barStyle = .black
        // self.view.window?.rootViewController = navController
        // 不需要导航栏就直接设置首页为根控制器
        let homeViewController = self.storyboard?.instantiateViewController(identifier: Constants.StoryBoard.homeViewController) as? HomeViewController
        self.view.window?.rootViewController = homeViewController
        self.view.window?.makeKeyAndVisible()
    }
    // 未登录就留在当前页面,不需要额外操作
}

可选优化:登录逻辑简化

LoginViewController中登录成功后不需要手动存uid到UserDefaults,去掉下面两行即可:

UserDefaults.standard.set(Auth.auth().currentUser!.uid, forKey: "user_uid_key")
UserDefaults.standard.synchronize()

补充说明

启动阶段的全局页面跳转不要用present方式,直接替换window的rootViewController更符合场景,不会触发层级警告。

内容的提问来源于stack exchange,提问作者Le'Anthony Howell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:27:03