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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:52:09