如何过滤“updateSearchResultsForSearchController”中的字典数组来search带有Swift的UITableView

我一直在围绕试图在我的UITableView中实现searchfunction。

我已经遵循了在这里stackoverflow大量的指示,并观看了YouTube上的video吨,我觉得现在我知道如何实现UISearchController,但我正在努力如何实际筛选我的数组在updateSearchResultsForSearchController函数。

我已经设法让search工作,如果我有一个简单的string值的数组,你在大多数实现search的在线示例中看到,但我有一个字典的数组,并不知道如何使用.filter来获得关键/值对中的字典。

我的peopleData数组是来自JSON文件的字典数组,它看起来像这样:

 { "people": [ { "ID" : "1", "firstname" : "Bob", "lastname" : "Smith", "age" : 25, "gender" : "Male" }, { "ID" : "2", "firstname" : "Fred", "lastname" : "Smith", "age" : "52", "gender" : "Male" } ] } 

我的视图控制器看起来像这样:

 // Created by Elliot Wainwright on 26/02/2016. // Copyright © 2016 Elliot Wainwright. All rights reserved. import UIKit class SelectPersonTableViewController: UITableViewController { var myList:NSMutableArray = [] var personData:NSMutableArray = [] var filteredPeopleData:NSMutableArray = [] var searchController : UISearchController! var resultsController = UITableViewController() @IBOutlet var selectPersonTable: UITableView! override func viewDidLoad() { super.viewDidLoad() guard let path = NSBundle.mainBundle().pathForResource("PeopleData", ofType: "json") else { print("error finding file") return } do { let data: NSData? = NSData(contentsOfFile: path) if let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary { personData = jsonResult["people"] as! NSMutableArray } } catch let error as NSError { print("Error:\n \(error)") return } self.resultsController.tableView.dataSource = self self.resultsController.tableView.delegate = self self.searchController = UISearchController(searchResultsController: self.resultsController) self.tableView.tableHeaderView = self.searchController.searchBar self.searchController.searchResultsUpdater = self definesPresentationContext = true selectPersonTable.reloadData() } func updateSearchResultsForSearchController(searchController: UISearchController) { //Filter through the array //--------------------------------------------- //I have no idea how to do this for my array!!! //--------------------------------------------- //Update the results TableView self.resultsController.tableView.reloadData() } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if tableView == self.tableView { return self.peopleData.count } else { return self.filteredPeopleData.count } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) if tableView == self.tableView { for person in personData { let thisPerson = personData.objectAtIndex(indexPath.row) cell.textLabel?.text = thisPerson["person"] as? String } } else { for person in filteredPeopleData { let thisPerson = filteredPeopleData.objectAtIndex(indexPath.row) cell.textLabel?.text = thisPerson["person"] as? String } } return cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { myList.addObject(personData.objectAtIndex(indexPath.row)) navigationController?.popViewControllerAnimated(true) } // MARK: - Navigation override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var vc = segue.destinationViewController as! ViewController vc.peopleList = myList } } 

正如你所看到的,在ViewDidLoad我将' personData = jsonResult["people"] as! NSMutableArray中的JSON文件的内容personData = jsonResult["people"] as! NSMutableArray personData = jsonResult["people"] as! NSMutableArray所以我结束了一个字典数组。

理想情况下,用户将能够在UISearchBar中键入一些内容,并且数组(以及表)将被过滤,以显示任何包含包含用户键入的部分的值的元素。 因此,input“ith”将返回两行,因为“Smith”中出现“ith”,表示数组中的两个元素。

至less,我希望能够search至less一个键/值。

尝试这个:

 let results = personData.filter({ person in if let firstname = person["firstname"] as? String, lastname = person["lastname"] as? String, query = searchController.searchBar.text { return firstname.rangeOfString(query, options: [.CaseInsensitiveSearch, .DiacriticInsensitiveSearch]) != nil || lastname.rangeOfString(query, options: [.CaseInsensitiveSearch, .DiacriticInsensitiveSearch]) != nil } return false }) filteredPeopleData = NSMutableArray(array: results) 

这将筛选具有匹配firstname属性的人员。 你可以实现类似的lastname