如何在使用UISearchController时在updateSearchResultsForSearchController中过滤对象数组?

我的search控制器类如下所示:

class FeastSearchTableViewController: UITableViewController, UISearchResultsUpdating { var feastEntries = [FeastEntry]() var filteredFeasts = [FeastEntry]() /* let tableData = ["One","Two","Three","Twenty-One"] var filteredTableData = [String]()*/ var resultSearchController = UISearchController() override func viewDidLoad() { super.viewDidLoad() self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.searchBar.sizeToFit() self.tableView.tableHeaderView = controller.searchBar return controller })() self.feastEntries = [FeastEntry(category:"Chocolate", name:"chocolate Bar"), FeastEntry(category:"Chocolate", name:"chocolate Chip"), FeastEntry(category:"Chocolate", name:"dark chocolate"), FeastEntry(category:"Hard", name:"lollipop"), FeastEntry(category:"Hard", name:"candy cane"), FeastEntry(category:"Hard", name:"jaw breaker"), FeastEntry(category:"Other", name:"caramel"), FeastEntry(category:"Other", name:"sour chew"), FeastEntry(category:"Other", name:"gummi bear")] // Reload the table self.tableView.reloadData() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 2 if (self.resultSearchController.active) { return self.filteredFeasts.count } else { return self.feastEntries.count } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let feasts = self.feastEntries[indexPath.row] let cell = tableView.dequeueReusableCellWithIdentifier("TimelineCellPhoto") as! TimelineCell cell.typeImageView.image = UIImage(named: "timeline-photo") cell.profileImageView.image = UIImage(named: "profile-pic-2") cell.nameLabel.text = feasts.name cell.photoImageView?.image = UIImage(named: "dish") cell.dateLabel.text = "2 mins ago" cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator return cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.performSegueWithIdentifier("feastDetail", sender: tableView) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if segue.identifier == "feastDetail" { let candyDetailViewController = segue.destinationViewController as! UIViewController } } func updateSearchResultsForSearchController(searchController: UISearchController) { filteredFeasts.removeAll(keepCapacity: false) let searchPredicate = NSPredicate(format: "category CONTAINS[c] %@", searchController.searchBar.text) //let array = (feastEntries as NSMutableArray).filteredArrayUsingPredicate(searchPredicate) /* let array = (feastEntries as NSArray).filteredArrayUsingPredicate(searchPredicate) filteredFeasts = array as! [String] */ self.tableView.reloadData() } } struct FeastEntry { let category : String let name : String } 

我有两个要求。 首先是如何根据updateSearchResultsForSearchController中的类别过滤feastEntries数组。 其次是如何实现这种情况下的范围栏filter。

在swift中检查filter方法…使用这个你可以过滤任何集合types,你可以写这样的东西:

  let filteredEntry = self.feastEntries.filter { $0.0 == “Chocolate”//filter condition } 

ScopeBar实现:

创build巧克力,硬和其他部分的分段控制…根据选定的段创build一个分段控制的IBaction对feastEntries数组应用filter,如上所示。