UISearchController updateSearchResults问题

我的问题是我在Swift 3中实现了UISearchController当我试图过滤它时很容易过滤的简单数组但是我的情况有点不同我有一个数组我从类中获取SQLite database中的所有数据所以它的类数组

managerControlClassArray ,它包含类数组的所有内容。

我想过滤updateSearchResults委托方法中的内容,但这真的很困难并且我做了很多研究而没有得到我想要的查询后我发现StackOverflow非常有用并质疑如果有人帮助我,我将不胜感激。

一些代码逻辑:

 manager = ModelManager.getInstance().getAllManager() // I get all the objects using singleton //manager class has following data id, title, designation, salary //In TableView i want to display data by using that let managerVar = manager[indexPath.row] cell.textLabel.text = managerVar.title 

编辑:

MasterTableViewController.swift

 import UIKit class MasterTableViewController: UITableViewController, UISplitViewControllerDelegate, UISearchResultsUpdating { var array: NSMutableArray! = NSMutableArray() var managerArray = [foodManager]() var filteredmanagerArray = [foodManager]() var searchController = UISearchController(searchResultsController: nil) override func viewDidLoad() { super.viewDidLoad() // Set the AppTitle using Config File self.title = GL_Appname managerArray = ModelManager.getInstance().getAllManagers() filteredmanagerArray = managerArray //copyTitleArrayForSearch() self.tableView.reloadData() self.splitViewController!.delegate = self; self.splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.allVisible //Seach Result Controller self.searchController.searchResultsUpdater = self self.searchController.dimsBackgroundDuringPresentation = false self.searchController.definesPresentationContext = true self.searchController.searchBar.sizeToFit() self.tableView.tableHeaderView = self.searchController.searchBar } /* func copyTitleArrayForSearch(){ for i in 0.. Int { return 1 } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{ return 60 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if searchController.isActive{ return filteredmanagerArray.count } else{ return managerArray.count } } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.adjustsFontSizeToFitWidth = true cell.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping cell.textLabel?.numberOfLines = 3 cell.textLabel?.textColor = UIColor.black cell.textLabel?.font = UIFont(name: "ChalkboardSE-Light", size: 14.0) if searchController.isActive { let fra = filteredmanagerArray[indexPath.row] cell.textLabel?.text = fra.title.uppercased() } else{ let fd = managerArray[indexPath.row] cell.textLabel?.text = fd.title.uppercased() } return cell } func updateSearchResults(for searchController: UISearchController) { self.tableView.reloadData() self.filteredRecipeArray.removeAll(keepingCapacity: false) let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) let array = (self.filteredRecipeArray as NSArray).filtered(using: searchPredicate) self.filteredRecipeArray = array as! [foodRecipe] self.tableView.reloadData() } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("DidSelect index Path: \(indexPath.row)") //print("Filtered Manager Index: \(filteredmanagerArray[indexPath.row]))") self.performSegue(withIdentifier: "showDetail", sender: self) } // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showDetail" { let index = self.tableView.indexPathForSelectedRow! as IndexPath let nav = segue.destination as! UINavigationController let vc = nav.viewControllers[0] as! DetailViewController if searchController.isActive { print("Manager Array Index: \(managerArray[index.row])") //var currentFilteredIndex = filteredmanagerArray[(indexPath as NSIndexPath).row] print("Filtered Manager Array Index: \(filteredmanagerArray[index.row])" } else{ vc.selectedmanagerArray = [managerArray[index.row]] } //vc.titleText = self.array.object(at: (index as NSIndexPath).row) as! String self.tableView.deselectRow(at: index, animated: true) } } // MARK: - UISplitViewControllerDelegate func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { return true } } 

Manager.swift

 class Manager: NSObject{ var id: String = String() var title: String = String() var ManagerDesignation: String = String() } 

谢谢。

再见。

我们可以使用Swift内置的filter方法吗?

 func updateSearchResults(for searchController: UISearchController) { self.tableView.reloadData() self.filteredRecipeArray.removeAll(keepingCapacity: false) guard let searchText = searchController.searchBar.text else { return } let array = managerArray.filter { return $0.id.range(of: searchText) != nil || $0.title .range(of: searchText) != nil || $0.ManagerDesignation.range(of: searchText) != nil } self.filteredRecipeArray = array self.tableView.reloadData() } 

编辑

更新了最新的Swift 3语法的答案