我有一个tableView,它目前是我的数据库中使用fetchAllUsers函数的所有用户的列表。如何从每个用户中提取单个用户ID并将其传递给另一个用户?因此,如果我点击表格中的第一个用户,我可以将该用户的特定用户ID传递给另一个功能吗?
func fetchAllUsers(completion: @escaping ([User])->()) {
let userRef = self.databaseRef.child("users")
userRef.observe(.value, with: { (userdata) in
var resultsArray = [User]()
for user in userdata.children {
let user = User(snapshot: user as! DataSnapshot)
resultsArray.append(user)
}
completion(resultsArray)
}) { (error) in
print(error.localizedDescription)
}
}
答案 0 :(得分:1)
首先,为方便起见,您可以使用以下方法添加到User类中。
static var ref: DatabaseReference {
return Database.database().reference(withPath: "users")
}
var ref: DatabaseReference {
return User.ref.child(snapshot.key)
}
以及DataSnapshot
的扩展程序,可以更轻松地将它们映射到User
。
extension DataSnapshot {
var childrenSnapshots: [DataSnapshot] {
return children.allObjects as? [DataSnapshot] ?? []
}
}
最后,我们可以重构您的fetchAllUsers
函数以使用帮助程序。
func fetchAllUsers(completion: @escaping ([User]) -> ()) {
User.ref.observe(.value, with: { (snapshot) in
completion(snapshot.childrenSnapshots.map { User(snapshot: $0) })
}) { (error) in
print(error.localizedDescription)
}
}
现在一切都更容易阅读,让我们考虑您的目标 - 您想要从表格视图中检索所选用户的ID。用户的id本质上是用户快照的关键,我们用它来实例化User
类。
您的User.init
函数应使用快照填充类属性,因此您也可以使用此机会检索快照的密钥并在User
类上设置属性以存储它。有一个更好的方式。
// MARK: Properties
var snapshot: DataSnapshot?
var key: String? {
return snapshot?.key
}
...
// MARK: Lifecycle
init(snapshot: DataSnapshot) {
self.snapshot = snapshot
...
}
使用快照初始化User
时,可以存储快照以供日后使用,并使用计算属性来检索密钥。因此,只要您将用户存储在数组中,就可以使用所选单元格的indexPath来查找数组中的所选用户。
var users: [Users]?
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if users?.indices.contains(indexPath.row) == true {
performSegue(withIdentifier: "showUser", sender: users?[indexPath.row])
}
}
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch (segue.destination, sender) {
case (let controller as ViewController, let user as User):
controller.user = space
default:
break
}
}
一旦拥有了您的用户,您就拥有了自己的密钥。一旦选择了单元格,您将需要执行segue - 我喜欢使用sender参数传递与segue相关的任何内容。例如,您可以传递选定的User
对象并将其设置在目标控制器中。
答案 1 :(得分:0)
如果我假设您的模型User
具有userId,并且您已经提到过要在resultsArray
中提取所有用户数据并在tableView中填充它。
现在,在选择任何tableView行时,您可以通过实现UITableView的didSelectRowAt
委托来获取您的个人用户数据。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let individualUser : User = resultsArray[indexPath.row]
self.anotherFunc(individualUser.userId)
}