Firebase - 为啥不搜索在我的应用中工作的用户? (当用户输入两个字母时更新搜索控制器)

Posted

技术标签:

【中文标题】Firebase - 为啥不搜索在我的应用中工作的用户? (当用户输入两个字母时更新搜索控制器)【英文标题】:Firebase - Why isnt search for users working in my app? (updating the searchcontroller when user has typed two letters)Firebase - 为什么不搜索在我的应用中工作的用户? (当用户输入两个字母时更新搜索控制器) 【发布时间】:2018-11-10 22:09:42 【问题描述】:

这个问题我很久了。我的 searchUsers 函数工作的唯一方法是当我把它放在 ViewDidLoad 中,然后将 .count 更改为等于或小于 0(因为它默认为 0)。

但是现在(我认为它应该如何工作),搜索剂量有效。

我想要它做的是:

    仅当用户输入至少两个字母时才开始对用户进行 Firebase 搜索(因此它仅在用户开始输入时搜索用户,并且仅显示和加载相关数据)。 在过滤搜索的同时更新表格视图。

这是我的代码:

import UIKit
import FirebaseDatabase
import Firebase
import SDWebImage
import ObjectMapper

class FollowUsersTableViewController: UIViewController 

    @IBOutlet var tableView: UITableView!

    private var viewIsHiddenObserver: NSKeyValueObservation?
    let searchController = UISearchController(searchResultsController: nil)
    var usersArray = [UserModel]()
    var filteredUsers = [UserModel]()
    var loggedInUser: User?
    //
    var databaseRef = Database.database().reference()
    //usikker på den koden over

    override func viewDidLoad() 

        super.viewDidLoad()

        //large title
        self.title = "Discover"
        if #available(ios 11.0, *) 
            self.navigationController?.navigationBar.prefersLargeTitles = true
         else 
            // Fallback on earlier versions
        

        self.tableView?.delegate = self
        self.tableView?.dataSource = self
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        self.searchController.delegate = self;

        definesPresentationContext = true
        tableView.tableHeaderView = searchController.searchBar

        //self.loadProfileData()

       //self.searchBar(searchController.searchBar, textDidChange: searchController.searchBar.text)
    

    func searchUsers(text: String) 
        if text.count >= 2 
            self.usersArray = [] //clear the array each time
            let endingText = text + "\uf8ff"
            databaseRef.child("profile").queryOrdered(byChild: "username")
                .queryStarting(atValue: text)
                .queryEnding(atValue: endingText)
                .observeSingleEvent(of: .value, with:  snapshot in

                    for child in snapshot.children 
                        let childSnap = child as! DataSnapshot
                        print(childSnap)
                        let userObj =  Mapper<UserModel>().map(JSONObject: childSnap.value!)
                        userObj?.uid = childSnap.key
                        if childSnap.key != self.loggedInUser?.uid  //ignore this user
                            self.usersArray.append(userObj!)

                        
                    
                    self.tableView.reloadData()
                )
        
     //may need an else statement here to clear the array when there is no text

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        let dest = segue.destination as! UserProfileViewController
        let obj = sender as! UserModel
        let dict = ["uid": obj.uid!, "username": obj.username!, "photoURL": obj.photoURL, "bio": obj.bio]
        dest.selectedUser = dict as [String : Any]
    


// MARK: - tableview methods
extension FollowUsersTableViewController: UITableViewDataSource, UITableViewDelegate 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return searchController.searchBar.text!.count >= 2 ? filteredUsers.count : 0
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FollowTableViewCell

        let user = filteredUsers[indexPath.row]

        cell.title?.text = user.username
        if let url = URL(string: user.photoURL ?? "") 
            cell.userImage?.sd_setImage(with: url, placeholderImage: #imageLiteral(resourceName: "user_male"), options: .progressiveDownload, completed: nil)
            cell.userImage.sd_setIndicatorStyle(.gray)
            cell.userImage.sd_showActivityIndicatorView()
        

        return cell
    

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 50
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        self.performSegue(withIdentifier: "user", sender: self.filteredUsers[indexPath.row])
    


// MARK: - search methods
extension FollowUsersTableViewController:UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate 

    func searchBar(_ searchBar: UISearchBar,
                   textDidChange searchText: String) 

        self.searchUsers(text: searchText)
    

    func updateSearchResults(for searchController: UISearchController) 
        searchController.searchResultsController?.view.isHidden = false
        filterContent(searchText: self.searchController.searchBar.text!)

        self.tableView.reloadData()
    

    func filterContent(searchText:String)
        if searchText.count >= 2
            self.filteredUsers = self.usersArray.filter user in
                return(user.username!.lowercased().contains(searchText.lowercased()))
            
        
     

【问题讨论】:

当您说“搜索不起作用”时,这是什么意思?是否调用了 searchUsers 函数? Firebase 不返回结果吗?能否请您澄清一下哪里出了问题并提供一些关于哪里出了问题的详细信息? 你好,Jay。感谢您之前的帮助,但我仍然坚持这一点。该函数确实打印了快照(因此它确实进行了搜索),但表格视图中没有显示任何内容。 另外,由于一些奇怪的原因,当我搜索 Ma 时,它只打印用户“Makalai”的信息,而不打印用户“Mattgilbert”。我不知道为什么会这样? 但我的主要问题是 tableview 是空的,即使信息显示在控制台中 你有没有想过我的朋友怎么了? 【参考方案1】:

你需要设置

searchController.searchBar.delegate = self

您符合UISearchResultsUpdating 并实现updateSearchResults 但它不调用func searchUsers(text: String)

并符合与搜索无关的UISearchControllerDelegate 方法Here

【讨论】:

我应该在哪里设置它?我认为将其设置为 self 尝试将 self.searchUsers(text: searchText) 移动到 updateSearchResults 当我将self.searchUsers(text: self.searchController.searchBar.text!) 添加到func updateSearchResults 时仍然有效 我认为控制台会像以前一样打印名称,但它仍然不会在 tableview 中显示

以上是关于Firebase - 为啥不搜索在我的应用中工作的用户? (当用户输入两个字母时更新搜索控制器)的主要内容,如果未能解决你的问题,请参考以下文章

为啥在超级终端中工作的永久别名在 vs-code bash 终端中不起作用?

为啥我的 XPath 查询(抓取 HTML 表)只能在 Firebug 中工作,而不能在我正在开发的应用程序中工作?

在 JBOSS 6 EAP 中部署一个在 JBOSS AS 5 中工作的简单 WAR 应用程序的问题

无法获得在 Propel2 中工作的外键

为啥我没有在我的 react 应用程序中获取 firebase 存储文件 url?

为啥我的由代码创建的 UITextField 不能在我的 tableview Cell 中工作?