gpt4 book ai didi

swift - 点击特定行时如何从 Firestore 获取特定信息

转载 作者:搜寻专家 更新时间:2023-10-31 23:05:54 25 4
gpt4 key购买 nike

这里的目标是在 Xcode 中点击 TableView 中的特定行时从 Firebase Firestore 获取特定信息。我已经找到了一种将数据存储到 TableView 中的方法: 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 行时,我想转到另一个显示每个特定行的姓名、电子邮件和电话的 View 。这可能吗?如果是这样,我该怎么做?

----------------------------

到目前为止,我想到了向每一行添加另一个变量,但不显示在该行上。由于在 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)
}

但这行不通。我不认为我可以使用电子邮件 var,因为它会为 Person.emailemail 提供错误。

如有任何帮助,我们将不胜感激。

--------------------------------

完整的代码块,如果有人需要的话(更新到我试过的内容):

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()
}
}
}
}
}

最佳答案

嘿,幸运的是,这实际上并不难。您需要做的就是这样:

//Create a custom UIViewController class which has a property of type Person.
class CustomViewController : UIViewController {
var person: Person?
// You'll need to set this up using a .xib file
weak var customView:CustomView?
}

class UsersViewController : UIViewController, UITableViewDelegate {
var person:[Person]?

//This method will be executed every time the user clicks on the row. Make sure that your current class adopts the UITableViewDelegate protocol.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Insert your functionality to get the correct person and set the person property in the new custom view controller.
let viewController = CustomViewController()
viewController.person = self.person?[indexPath.row]
// Display the new custom view controller.
self.navigationController?.pushViewController(viewController, animated: true)
}
}

解释:

  1. 创建一个具有 Person 类型属性的自定义 UIViewController 类。
  2. 此方法 - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) - 将在用户每次单击该行时执行。 确保您当前的类采用 UITableViewDelegate 协议(protocol)。
  3. 在 didSelectRow 函数中,插入您的功能以获取正确的人员并在新的自定义 View Controller 中设置人员属性。
  4. 显示新的自定义 View Controller 。

您需要确保设置 View Controller 的 View 以显示人员对象中的数据。看看这个 video如果您需要知道该怎么做。

如果您想对此进行任何澄清,请告诉我!

编辑:

有多种方法可以做到这一点。 Firebase 具有监视文档的功能,如果文档服务器端发生更改,您可以在应用程序中应用这些更改。看看here .

我可能会考虑使用类似的东西。

或者您可以在 didSelectRow 中获取数据,然后在获取数据后显示新的 View Controller 。

关于swift - 点击特定行时如何从 Firestore 获取特定信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com