FirebaseをUISearchControllerデリゲートに組み込む方法についての情報はありますか?私はそれについての固い情報を見つけることができません。おそらく何千人もの従業員がいるかもしれません。FirebaseとUISearchbarControllerはクライアントではなくサーバ経由で検索します。 - スウィフトiOS
検索コントローラの代理人updateSearchResultsForSearchController
を使用し、NSPredicate
を使用してNSUserDefaultsを使用していてもFirebaseを使用している場合は、私が探しているものをフィルタリングする方法を知っています。
私はFirebaseDatabaseに保存されたカスタムデータモデルオブジェクトを持っていると私はオブジェクト内の次のプロパティのすべてを検索したい私の質問
にいくつかのより多くのコードを追加しました。
lastName
idNumber
deptNumber
position
私が探している文字列全体が表示されるまで、第1表のセル内の部分文字列を表示する必要があり、これらのプロパティのいずれかを検索します。したがって、文字「S」を入力すると、「S」で始まるすべての従業員の姓が表示されます。私が "Sa"を入力すると、これらの文字にフィルタをかける "私の理解では、部分検索文字列を取得するのに、データは返されないが、データは返されない。
Anyway here are all code
私のオブジェクトは、次のとおりです。
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"
マイルール:
ここで起きているのは、従業員が雇われた日で、電子メールアドレスとPWを使用して企業アカウントを作成するよう求められた日です。 同時に、 "hireDate"パスである子と最後に従業員 "uid"パスである "employees"パスが作成されます。この従業員「uidは」私は「従業員」からの検索したいパスノードである
{
"rules": {
"users" : {
"$uid" : {
".read": true,
".write": "auth != null && auth.uid == $uid"
}
},
"employees": {
"$hireDate": {
"$uid": {
".read": true,
".indexOn": ["lastName", "idNumber", "deptNumber", "position"]
}
}
}
}
}
マイsearchControllerここ
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と統合する方法の例については、[懐中電灯](https://github.com/firebase/flashlight)を参照してください。 – Kato
@Katoありがとう私はそれを探しています –