【发布时间】:2019-12-10 11:38:56
【问题描述】:
这里的目标是在 Xcode 中的 Table View 中点击特定行时从 Firebase Firestore 获取特定信息。我已经找到了一种将数据存储到 Table View 中的方法: p>
func loadData() {
FirebaseFirestore.root.collection("users").getDocuments { (snapshot, error) in
if let error = error {
print(error.localizedDescription)
} else {
if let snapshot = snapshot {
for document in snapshot.documents {
let data = document.data()
let name = data["name"] as? String ?? ""
let email = data["email"] as? String ?? ""
let phone = data["phone"] as? String ?? ""
let newPerson = Person(name: name, email: email, phone: phone)
self.people.append(newPerson)
print (self.people)
let newIndexPath = IndexPath(row: self.people.count - 1, section: 0)
self.table.beginUpdates()
self.table.insertRows(at: [newIndexPath], with: .automatic)
self.table.endUpdates()
}
}
}
}
}
运行时会显示:
例如,当我点击第 1 行时,我想进入另一个视图,该视图显示每个特定行的姓名、电子邮件、电话。这可能吗?如果是这样,我该怎么做?
------------------
到目前为止,我想为每一行添加另一个变量,但不显示在该行上。由于在 Firebase 中,文档 ID 是电子邮件,我可以将 var email 设置为每一行,并使用 getDocument() 通过电子邮件检索文档,即文档 ID。
我所做的只是使用变量 email 来尝试在 didSelectRowAt 函数上使用 getDocument。
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let tappedUser = FirebaseFirestore.root.collection("users").document(email)
performSegue(withIdentifier: "toPersonDesc", sender: nil)
}
但这不起作用。我认为我不能使用 email 变量,因为它会为 Person.email 提供错误,而只是 email。
任何帮助将不胜感激。
-------------------
如果有人需要,整个代码块(更新到我尝试过的):
import UIKit
import FirebaseFirestore
struct Person {
let name, phone, email: String
}
class Cell: UITableViewCell {
@IBOutlet weak var phone: UILabel!
@IBOutlet weak var name: UILabel!
@IBOutlet weak var email: UILabel!
}
class PeopleViewController: UITableViewController {
@IBOutlet var table: UITableView!
var people = [Person]()
private var document: [DocumentSnapshot] = []
override func viewDidLoad() {
super.viewDidLoad()
table.tableFooterView = UIView(frame: CGRect.zero)
self.table.delegate = self
self.table.dataSource = self
loadData()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return self.people.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let person = people[indexPath.row]
let cell = self.table.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell
cell.name.text = person.name
cell.phone.text = person.phone
cell.email.text = person.email
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let tappedUser = FirebaseFirestore.root.collection("users").document(Person.email)//Error here
performSegue(withIdentifier: "toPersonDesc", sender: nil)
}
func loadData() {
FirebaseFirestore.root.collection("users").getDocuments { (snapshot, error) in
if let error = error {
print(error.localizedDescription)
} else {
if let snapshot = snapshot {
for document in snapshot.documents {
let data = document.data()
let name = data["name"] as? String ?? ""
let phone = data["phone"] as? String ?? ""
let email = data["email"] as? String ?? ""
let newPerson = Person(name: name, phone: phone, email: email)
self.people.append(newPerson)
print (self.people)
let newIndexPath = IndexPath(row: self.people.count - 1, section: 0)
self.table.beginUpdates()
self.table.insertRows(at: [newIndexPath], with: .automatic)
self.table.endUpdates()
}
}
}
}
}
【问题讨论】:
-
有什么问题?你试过什么?
-
@Daniel,哦,抱歉,我还没有用我尝试过的方法编辑问题,我现在就编辑它。
-
看看下面的答案。
-
当用户点击时将该行电子邮件发送到下一个屏幕。在下一个屏幕上使用电子邮件查询数据库并获取您需要的所有数据。
-
@JawadAhmed,我如何将“电子邮件”发送到下一个屏幕?一旦我明白了,我想我可以完成剩下的。
标签: swift firebase uitableview google-cloud-firestore