ios - 如何添加搜索用户功能?

标签 ios swift google-cloud-firestore

很长一段时间以来,我一直在尝试添加搜索用户机制,但没有成功。我似乎找不到太多东西,而且有解释的地方几乎总是针对 FirebaseDatabase 而不是 Firestore。我对 Swift、Firebase 和一般编码都很陌生,所以任何关于我在哪里出错以及如何实现这一点的解释都将不胜感激。

这是我最近的尝试(我相信这会让你们中的许多人不寒而栗):

import UIKit
import Firebase
import FirebaseAuth
import FirebaseFirestore

class FindUsersViewController: UITableViewController {

    var usersArray = [String]()
    var filteredUsers = [String]()


    override func viewDidLoad() {
        super.viewDidLoad()




        fetchUser()


        // Do any additional setup after loading the view.
    }


            func fetchUser() {
                    let db = Firestore.firestore()
                    let usernameSearch = db.collection("users")
                    usernameSearch.getDocuments { (snapshot, error) in
                        if error != nil {
                            print("Error obtaining usernames")
                        } else {
                            for document in snapshot!.documents {
                                let field = document.data()["username"]
                                self.usersArray.append(field as! String)
                                print(self.usersArray)

                            }

                        }

                    }


            }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 5
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell")
        cell.textLabel?.text = usersArray
        return cell
    }



}

我似乎无法解决这个问题,而且因为我对一切都是新手,Firebase 文档似乎比启发性更神秘,因此非常感谢您提供任何帮助!

(我想我在使用数组时出错了......也许...... idk......)

--
我应该补充:
我有一个“用户”集合,每个用户的文档都包含“用户名”字段(以及 uid、密码和电子邮件字段)。

最佳答案

您快到了!

首先让我们创建一个用户对象,它将代表您的用户的所有属性。现在假设一个用户有一个 id、一个名字和一个电子邮件,但可以随意匹配您的项目要求:

import FirebaseFirestore

struct User {
    let id: String
    let name: String
    let email: String
}

我们还为我们的用户添加了一个带有便利初始化程序的扩展,这将允许我们快速轻松地将 Firestore 文档转换为用户:
extension User {

    init(queryDocument: QueryDocumentSnapshot) {
        guard let name = queryDocument.data()["name"] as? String else { fatalError() }
        guard let email = queryDocument.data()["email"] as? String else { fatalError() }
        self.init(id: queryDocument.documentID, name: name, email: email)
    }
}

现在,这就是你的 FindUsersViewController可能看起来像:
import UIKit
import FirebaseFirestore

class FindUsersViewController: UITableViewController {

    // Keep a reference to your database, and your users collection:
    private let database = Firestore.firestore()
    private lazy var usersReference = database.collection("users")

    private let cellReuseIdentifier = "cellReuseIdentifier"
    // This is the array that will keep track of your users, you will use it to populate your table view data:
    private var users = [User]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Set your table view datasource and delegate:
        tableView.dataSource = self
        tableView.delegate = self
        // Register your cell identifier:
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        fetchUsers()
    }

    private func fetchUsers() {
        // Create your query, for instance we will return only the first 10 users and ordered by name:
        let query = usersReference.order(by: "name", descending: true).limit(to: 10)
        // Now simply fetch the documents that match the query:
        query.getDocuments { [weak self] (querySnapshot, error) in
            guard let self = self else { return }
            guard let querySnapshot = querySnapshot, error == nil else {
                // Oops, something wrong happened here
                return
            }
            // You get successfully your documents here, so just transform them to your User model:
            let users = querySnapshot.documents.map { User(queryDocument: $0) }
            // Then fill your array, and make sure you reload your table data on the main thread:
            DispatchQueue.main.async {
                self.users = users
                self.tableView.reloadData()
            }
        }
    }

    // MARK: UITableViewDataSource methods

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Returns the number of users in your array:
        return users.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
        // Configure your cell here via your users array:
        cell.textLabel?.text = users[indexPath.row].name
        return cell
    }

    // MARK: UITableViewDelegate methods

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }
}

这将为您提供一个很好的用户列表。我在 View Controller 中添加了很多注释,所以我认为它是不言自明的,但如果您仍有疑问,请随时告诉我。

祝你的应用好运! :)

关于ios - 如何添加搜索用户功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62380616/

相关文章:

ios - 在 iOS/Swift 中以编程方式设置 View 后 RevealViewController 不工作

javascript - 输出嵌套集合中的所有文档

javascript - Firestore如何停止事务?

ios - 私有(private)类(class)成员可在类(class)外访问

iphone - 混合模式,可自由绘制重叠的UIColor

Swift zip 生成器只迭代一侧两次

flutter - 等到 firestore 中的数据成功更新

sql - SQLite 中的 Select 语句识别行号

ios - 异常 "mutating method sent to immutable object"

ios - 切换单元格的UITableView