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

Swift iOS使用Firebase查询结果填充ListView的报错问题求助

问题修复说明

报错根因

  • 第一个报错:UIViewController 原生自带title属性,类型为String?,你自定义的同名数组属性和父类属性冲突,直接重命名自定义属性即可解决。
  • 第二个报错:Firestore返回的document.data()为[String: Any]类型,直接按下标取值后未做安全类型转换,触发方法匹配错误。

额外优化点

  1. 移除冗余的长度统计变量,直接用数据源数组的count属性返回行数,避免强制解包崩溃
  2. 异步拉取Firestore数据完成后,必须主动调用tableView的reloadData()方法刷新列表,否则界面不会更新
  3. 增加可选值校验逻辑,避免强制解包、强制类型转换引发的闪退
  4. 增加弱引用标记避免循环引用,刷新UI操作切回主线程执行

修正后完整代码

class BoatListViewContoller: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // 重命名属性避免和父类的title冲突
    var productTitles: [String] = []

    func readProducts(){
        let db = Firestore.firestore()
        db.collection("products").getDocuments(){ [weak self] querySnapshot, err in
            guard let self = self else { return }
            if let err = err {
                print("Error getting documents: \(err)")
                return
            }
            guard let documents = querySnapshot?.documents else { return }
            // 先清空原有数据避免重复添加
            self.productTitles.removeAll()
            for document in documents {
                // 安全读取字段,避免强转崩溃
                if let title = document.get("title") as? String {
                    self.productTitles.append(title)
                }
            }
            // 异步回到主线程刷新列表
            DispatchQueue.main.async {
                self.myTableView.reloadData()
            }
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return productTitles.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath)
        
        cell.textLabel!.text = productTitles[indexPath.row]
        cell.backgroundColor = UIColor(red: 212/255, green: 255/255, blue: 241/255, alpha: 1)
        return cell
    }
    private var myTableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let displayWidth: CGFloat = self.view.frame.width
        let displayHeight: CGFloat = self.view.frame.height
        myTableView = UITableView(frame: CGRect(x: 0, y: 0, width: displayWidth, height: displayHeight))
        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
        myTableView.dataSource = self
        myTableView.delegate = self
        myTableView.backgroundColor = UIColor(red: 212/255, green: 255/255, blue: 241/255, alpha: 1)
        view.addSubview(myTableView)
        // 页面加载完成后触发数据拉取
        readProducts()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:54:00