【发布时间】:2017-02-16 00:47:51
【问题描述】:
有没有人知道如何将 Firebase 整合到 UISearchController 委托中?我找不到任何可靠的信息。可能有数千名员工。
我知道如何使用搜索控制器委托updateSearchResultsForSearchController 并使用NSPredicate 来过滤我正在寻找的内容,如果我使用的是 NSUserDefaults 但我不确定是否使用 Firebase。
我在我的问题中添加了更多代码
我有一个保存在 FirebaseDatabase 中的自定义数据模型对象,我想在该对象中搜索以下所有属性。
lastName
idNumber
deptNumber
position
搜索这些属性中的任何一个都应该首先在表格单元格中显示部分字符串,直到显示我要查找的整个字符串。因此,如果我输入字母“S”,则应显示所有以“S”开头的员工姓氏。如果我输入“Sa”,in 将过滤到这些字母“。据我了解,我应该使用“\u{f8ff}”来获取部分搜索字符串,但不返回任何数据。
所有的代码都在这里
我的对象是:
class Employee{
var firstName: String?
var lastName: String?
var idNumber: String?
var deptNumber: String?
var position: String?
}
我的路
-root
-users
-uid
|_"email":"emailAddress"
|_"userID":"uid"
|_"firstName":"firstName"
|_"lastName":"lastName"
-employees
-hireDate
-uid //this is the same uid from the users node so I know who's who
|_"firstName":"firstName"
|_"lastName":"lastName"
|_"idNum":"idNumber"
|_"deptNumber":"deptNumber"
|_"position":"position"
我的规则:
这里发生的是员工被雇用的那一天,他们被要求使用他们的电子邮件地址和密码创建一个公司帐户。 同时创建了一个“员工”路径,其中一个孩子是“hireDate”路径,最后是员工“uid”路径。这个员工“uid”是我想从“员工”节点搜索的路径
{
"rules": {
"users" : {
"$uid" : {
".read": true,
".write": "auth != null && auth.uid == $uid"
}
},
"employees": {
"$hireDate": {
"$uid": {
".read": true,
".indexOn": ["lastName", "idNumber", "deptNumber", "position"]
}
}
}
}
}
我的搜索控制器
import UIKit
class SearchController: UIViewController{
@IBOutlet var tableView: UITableView!
var searchController: UISearchController!
var employeesToFilter = [Employee]()
var filteredSearchResults = [Employee]()
override func viewDidLoad() {
super.viewDidLoad()
self.searchController = UISearchController(searchResultsController: nil)
self.tableView.delegate = self
//all searchController properties get set here no need to include them though
let ref = FIRDatabase.database().reference()
let employeeRef = ref.child("employees")
employeeRef?.queryOrderedByChild("lastName").queryStartingAtValue("\u{f8ff}").queryLimitedToFirst(20).observeEventType(.ChildAdded, withBlock: {
(snapshot) in
if let dict = snapshot.value as? [String:AnyObject]{
let firstName = dict["firstName"] as! String
let lastName = dict["lastName"] as! String
let idNumber = dict["idNumber"] as! String
let deptNumber = dict["deptNumber"] as! String
let position = dict["position"] as! String
let employee = Employee()
employee.firstName = firstName
employee.lastName = lastName
employee.idNumber = idNumber
employee.deptNumber = deptNumber
employee.position = position
self.employeesToFilter.append(employee)
}
})
self.tableView.reloadData()
}
override func viewDidAppear(animated: Bool) {
self.searchController.active = true
}
deinit {
self.searchController = nil
}
}
//MARK:- TableView Datasource
extension SearchBuildingController: UITableViewDataSource, UITableViewDelegate{
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.filteredSearchResults.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("SearchCell", forIndexPath: indexPath) as! SearchCell
let searchString = self.filteredSearchResults[indexPath.row]
cell.firstNameLabel.text = searchString.firstName
cell.lastNameLabel.text = searchString.lastName
cell.idNumberLabel.text = searchString.idNumber
cell.deptNumberLabel.text = searchString.deptNumber
cell.positionLabel.text = searchString.position
return cell
}
}
//MARK:- SearchController Delegates
extension SearchController: UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate{
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
tableView.reloadData()
}
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.employeesToFilter.removeAll(keepCapacity: false)
self.filteredSearchResults.removeAll(keepCapacity: false)
let searchText = self.searchController.searchBar.text
let searchPredicate = NSPredicate(format: SELF.lastName CONTAINS [c] %@ OR SELF.idNumber CONTAINS [c] %@ OR SELF.deptNumber CONTAINS[c] %@ OR SELF.position CONTAINS [c] %@", searchText!, searchText!, searchText!, searchText!)
let array = (self.employeesToFilter as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.filteredSearchResults = array as! [Employee]
tableView.reloadData()
}
}
【问题讨论】:
-
你不会只搜索
"\u{f8ff}";这没有任何意义,因为您没有给它“开始于”标准。因此,您需要startingAtValue("S")和endingAtValue("S\u{f8ff}");之类的东西。请注意,尝试在 Firebase 中实现高级模糊/上下文搜索通常比它的价值更复杂。一个合适的搜索引擎会更加健壮,而且在我看来,启动和运行的复杂性要低得多。有关如何将搜索与 Firebase 集成的示例,请参阅 Flashlight。 -
@Kato 谢谢我正在调查它
标签: ios uitableview swift2 firebase-realtime-database uisearchcontroller