swift - Firebase - 为什么不搜索在我的应用程序中工作的用户? (当用户输入两个字母时更新搜索 Controller )

标签 swift firebase uitableview uisearchcontroller

这个问题我已经困扰很久了。我的 searchUsers 函数工作的唯一方法是将其放入 ViewDidLoad 中,然后将 .count 更改为等于或小于 0(因为默认情况下为 0)。

但就目前情况而言(我认为它应该如何工作),搜索不起作用。

我想要它做的是:

  1. 仅当用户输入至少两个字母时才启动 firebase 搜索用户(因此,它仅在用户开始输入时搜索用户,并且仅显示和加载相关数据)。
  2. 还可以更新表格 View 并过滤搜索。

这是我的代码:

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 + "\u{f8ff}"
            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()))
            }
        }
    } 
}

最佳答案

您需要设置

searchController.searchBar.delegate = self

您遵循UISearchResultsUpdating并实现updateSearchResults,但它不会调用func searchUsers(text: String)

并符合UISearchControllerDelegate,与其方法的搜索外观无关Here

关于swift - Firebase - 为什么不搜索在我的应用程序中工作的用户? (当用户输入两个字母时更新搜索 Controller ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243916/

相关文章:

ios - 如果我的应用程序在其各种 View Controller 中使用位置管理器,我应该在哪里实例化它?

javascript - 有没有一种简单的方法可以在 web worker 中运行 Firebase?

ios - UITableViewController 偶尔调整 TableView 的大小

ios - 需要在 Swift 中点击一下来停止密集型功能

swift - 如何在 NSDecimalNumber 中存储 1.66

ios - swift:监听 "struct variable"-change 事件?

使用 createCustomToken 生成自定义身份验证 token 时 firebase 函数中的 FirebaseAuthError

android - Firebase Cloud Messaging 是否依赖于包名?

iphone - 自定义单元格被其他单元格替换

ios - 自定义 UItableViewCell 未加载图像? swift 4