Swift iOS使用Firebase查询结果填充ListView的报错问题求助
问题修复说明
报错根因
- 第一个报错:
UIViewController原生自带title属性,类型为String?,你自定义的同名数组属性和父类属性冲突,直接重命名自定义属性即可解决。 - 第二个报错:Firestore返回的
document.data()为[String: Any]类型,直接按下标取值后未做安全类型转换,触发方法匹配错误。
额外优化点
- 移除冗余的长度统计变量,直接用数据源数组的count属性返回行数,避免强制解包崩溃
- 异步拉取Firestore数据完成后,必须主动调用tableView的
reloadData()方法刷新列表,否则界面不会更新 - 增加可选值校验逻辑,避免强制解包、强制类型转换引发的闪退
- 增加弱引用标记避免循环引用,刷新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
相关产品推荐
相关产品推荐

