如何解决如何使单元格文本标签成为 Firestore 集合中文档中的特定字段?
所以我的目标是让我的仪表板中的 tableview 单元格填充我的 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 查询。虽然这在技术上可行,但它会为桌子上的每个单元格触发,并且效率非常低。您应该将该 API 调用移动到其他地方,在那里您可以更好地控制它发生的位置(viewDidLoad
可能是最基本的示例),然后存储结果,以便您以后可以从 cellForRowAt
访问它们
执行查询后,document.data()
会返回 [String:Any]
,因此您可以通过执行以下操作来选择字段:
let eventName = document.data()["event_name"]
或者您可以使用 document.get("event_name")
您可能只想存储名称,或者更好的是,将所有字段存储在某处(又名 var events : [Event]
)的代表事件的对象,然后您可以在 cellForRowAt
中填充您的单元格通过执行以下操作:
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
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。