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

Swift中Firebase获取的autoID无法传递至新ViewController问题排查

问题分析与解决:Firebase异步查询导致ID传递失败

你遇到的这个问题其实很典型——明明在didSelectRowAt里能正常打印Firebase返回的帖子ID,但通过segue跳转到目标ViewController后,拿到的ID却是空的,输出Optional(())。

问题根源

核心原因是Firebase的数据库查询是异步操作:当你调用observe(.childAdded)时,代码不会停在这里等待Firebase返回数据,而是直接往下执行performSegue。这时候闭包里的赋值代码(self.passID = currentPostID)还没来得及执行,passID还是初始的空字符串,所以传递到下一个VC的自然是空值。

解决方案

把performSegue移到Firebase查询的闭包内部,确保只有在成功获取到ID并完成赋值后,再触发页面跳转:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    jobsRef.queryOrdered(byChild: "userID").queryEqual(toValue: userID).observe(.childAdded, with: {snapshot in
        let currentPostID = snapshot.key
        self.passID = currentPostID
        print(self.passID)
        // 拿到有效ID后再执行跳转
        self.performSegue(withIdentifier: "toJobDetail", sender: indexPath)
    })
}

这样修改后,segue只会在Firebase返回数据、passID被正确赋值之后才会执行,目标VC就能拿到正常的ID了。

额外优化建议

其实你还可以省去全局的passID变量,直接把获取到的ID作为sender传递给segue,代码逻辑会更清晰,也避免了全局变量可能带来的潜在问题:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    jobsRef.queryOrdered(byChild: "userID").queryEqual(toValue: userID).observe(.childAdded, with: {snapshot in
        let currentPostID = snapshot.key
        // 直接将ID作为sender传递
        self.performSegue(withIdentifier: "toJobDetail", sender: currentPostID)
    })
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toJobDetail" {
        if let postID = sender as? String, let nextVC = segue.destination as? MyProfileJobDetailViewController {
            nextVC.jobDetails = MyProfileJobDetailViewController.JobDetails(IDPassed: postID)
        }
    }
}

内容的提问来源于stack exchange,提问作者SwiftyJason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:47:37