Swift ViewController条件Segue问题:Firebase登录后跳转异常
解决Firebase登录后无论成功失败都执行Segue的问题
看起来你遇到的问题有点棘手——明明在if-else里加了判断,但不管登录成功与否,跳转到首页的segue总是会触发。既然你已经排除了Firebase验证逻辑和输入框的问题,那咱们从几个容易忽略的点入手排查:
1. 确保UI操作在主线程执行
Firebase的signIn(withEmail:password:completion:)是异步网络请求,它的回调闭包默认在后台线程执行。而所有UI相关操作(比如performSegue)必须在主线程运行,否则可能出现不可预期的行为,比如条件判断失效、UI操作提前触发等。
修改代码,把performSegue放到主线程队列里:
func handleSignIn(username: String, password: String) { Auth.auth().signIn(withEmail: username, password: password) { user, error in if error == nil && user != nil { print("Logged in!") // 切换到主线程执行Segue DispatchQueue.main.async { self.performSegue(withIdentifier: "toHome", sender: nil) } } else { print("Error logging in: \(error!.localizedDescription)") } } }
2. 优化条件判断的严谨性
虽然Firebase文档说明登录回调里要么有user要么有error,但极端情况下可能出现两者都为空的状态。咱们可以调整判断逻辑,先处理错误,再确认用户存在,这样能避免意外进入成功分支:
func handleSignIn(username: String, password: String) { Auth.auth().signIn(withEmail: username, password: password) { user, error in // 优先处理错误情况 if let error = error { print("Error logging in: \(error.localizedDescription)") return } // 确认用户存在后再执行跳转 guard let user = user else { print("Unexpected error: No user returned after sign-in") return } print("Logged in! User ID: \(user.uid)") DispatchQueue.main.async { self.performSegue(withIdentifier: "toHome", sender: user) } } }
3. 检查Storyboard中的自动Segue绑定
这是最容易被忽略的点!如果你在Storyboard里直接给登录按钮拖了一条Segue到首页(而不是通过代码触发),那么不管你代码里的登录逻辑如何,只要点击按钮就会自动触发Segue。
解决方法:
- 打开Storyboard,找到登录按钮和首页之间的Segue,删除这条自动触发的Segue
- 确保只有代码里的
performSegue(withIdentifier:)负责触发跳转
额外优化:避免循环引用
在闭包里直接使用self可能导致内存泄漏,建议用[weak self]捕获弱引用的self,这是Swift异步代码的最佳实践:
func handleSignIn(username: String, password: String) { Auth.auth().signIn(withEmail: username, password: password) { [weak self] user, error in guard let self = self else { return } // 确保self未被释放 if let error = error { print("Error logging in: \(error.localizedDescription)") return } guard let user = user else { print("Unexpected error: No user returned after sign-in") return } print("Logged in! User ID: \(user.uid)") DispatchQueue.main.async { self.performSegue(withIdentifier: "toHome", sender: user) } } }
按照上面的步骤排查和修改,应该就能解决你的问题了!
内容的提问来源于stack exchange,提问作者Code Daddy
相关产品推荐
相关产品推荐

