iOS开发:自动登录跳转视图控制器报警告且用户记忆功能失效
问题根因
- 视图跳转时机错误:你在
ViewController的viewDidLoad方法中调用present接口,此时该控制器尚未被添加到应用的视图层级中,属于detached脱离状态,系统会触发警告,跳转逻辑也大概率失效。 - 分支逻辑写反:未登录的else分支中,你错误将根控制器设置为
ViewController本身,会造成无限循环,无法进入正常流程。 - 登录状态校验冗余: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
相关产品推荐
相关产品推荐

