如何使单元格文本标签成为 Firestore 集合中文档中的特定字段?

How to make the cell text label a specifc field in a document in a Firestore collection?

所以我的目标是让我的仪表板中的表格视图单元格填充我的 Firestore 集合中文档的特定字段“event_name”。这是我使用 Firebase 文档编写的代码。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: Constants.CellDetails.cellName, for: indexPath) as! SwipeTableViewCell
    cell.delegate = self
 
    db.collection("school_users").whereField("event_cost", isEqualTo: "Free")
        .getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    cell.textLabel?.text = "\(document.data())"
                }
            }
    }
    

所以基本上,我期望发生的是代码会神奇地在单元格中填充字段名称,我知道这是不现实的。我将提供实际发生的屏幕截图。

所以是的,如果有人知道我可以对该字段进行非常具体的查询并能够将其填充到单元格中的方法,那就太好了。谢谢

这里有几个问题。

首先是您在 cellForRowAt 内执行 Firebase 查询。虽然这在技术上可行,但它会为 table 上的每个单元格触发并且效率非常低。您应该将 API 调用移动到其他地方,您可以更好地控制它发生的位置(viewDidLoad 可能是最基本的示例),然后存储结果,以便以后可以从 cellForRowAt

一次,您执行了查询,document.data() returns a [String:Any] 因此您可以通过执行以下操作来选择一个字段:

let eventName = document.data()["event_name"]

或者您可以使用 document.get("event_name")

您可能只想存储名称,或者更好的是,存储代表事件的对象以及某处的所有字段(又名 var events : [Event]),然后您可以在 [=13] 中填充您的单元格=] 通过做类似的事情:

cell.textLabel?.text = events[indexPath.row].eventName

Firebase 文档中有更多关于从 Firebase 获取数据并将该数据转换为对象的文档:https://firebase.google.com/docs/firestore/query-data/get-data

其中一些内容的(未经测试的)示例。在现实生活中,你会想要处理错误,而不是强制展开任何东西,等等。

struct Event {
    var eventName : String
}

class FBViewController : UITableViewController {
    var events = [Event]()
    
    override func viewDidLoad() {
        db.collection("school_users").whereField("event_cost", isEqualTo: "Free")
                .getDocuments() { (querySnapshot, err) in
                    if let err = err {
                        print("Error getting documents: \(err)")
                    } else {
                        self.events = querySnapshot!.documents.map { document in
                            return Event(eventName: (document.get("event_name") as? String) ?? "")
                        }
                        self.tableView.reloadData()
                    }
            }
    }
    
//Other table view functions....

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: Constants.CellDetails.cellName, for: indexPath) as! SwipeTableViewCell
        cell.textLabel?.text = events[indexPath.row].eventName
    }
}