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 应用程序的问题