如何在UITableView中实现UISearchController – Swift

我是Swift的新手,我试图添加searchfunction,我的UITableView是在UIViewController类。 我GOOGLE了很多,发现UISearchDisplayController已被弃用,并由UISearchController取代。 当我试图寻找教程,我没有find任何具体的UITableView 。 其中一些是在UITableViewController实现的。 所以这是我的问题:

  1. 我们可以在UIViewController类的UITableView中实现UISearchController吗? (我想我们可以)

  2. 如果可以的话,请转换Objective-C中编写的这些代码行。 或者如果有一些非常好的教程,请让我知道。

     @property (strong, nonatomic) UISearchController *searchController; UITableViewController *searchResultsController = [[UITableViewController alloc] init]; // Init UISearchController with the search results controller self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController]; // Link the search controller self.searchController.searchResultsUpdater = self; 

资源

编辑:我想分配search结果更新在

 class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating { override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.blackColor() self.addTableViewWithSection() self.searchResultsController = UITableViewController() var controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false } } 

*然而,在线controller.searchResultsUpdater =自我我得到了eroor不能分配一个值types“ UISearchResultsUpdating ?”值types“ViewController”? 所以我真的怀疑我是否可以在UIViewControllertypes的类中使用UISearchController

是的,search的方式已经根本改变了我认为是一个更好的系统。 新系统对于大多数简单实现来说更好,更直接。 使用它非常简单。

首先,让你的课程符合UISearchResultsUpdating协议。

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

添加search控制器属性:

 class MyTableViewController: UTableViewController, UISearchResultsUpdating { let searchController = UISearchController(searchResultsController: nil) } 

在viewDidLoad中添加search栏:

 override func viewDidLoad() { super.viewDidLoad() searchController.searchResultsUpdater = self searchController.hidesNavigationBarDuringPresentation = false searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.sizeToFit() self.tableView.tableHeaderView = searchController.searchBar } 

最后,实现来自UISearchResultsUpdating协议的updateSearchResultsForSearchController方法:

 func updateSearchResultsForSearchController(searchController: UISearchController) { } 

这个方法的实现当然取决于你从哪里search数据。 它将在您input时更新您的当前表格视图与您的search内容。 确保更新数据源并在updateSearchResultsForSearchController方法中重新加载表视图。 同样,它会在您键入时更新,因此请确保如果要search的数据很大或者如果您从Internet上search,请在此方法中添加一些并发性。

如果您想使用不同的控制器来填充search结果,则可以在初始化searchController属性时传递该VC。

编辑 :我已经重读你的问题,它看起来像我忘了添加重要的东西。

UITableViewController有一个名为tableView的成员。 你可以抓住控制器的表格视图,但要填充你的UITableView ,你不需要触摸它。 你不能直接使用UITableView的SearchController逻辑。 你必须和控制器一起工作。 使用UITableViewController委托和数据源方法来更新您的表格UI与您的search结果。

请阅读使用UITableViewController,UITableViewDelegate和UITableViewDataSource,以便您可以了解如何让您的search结果。

在任何人的情况下,像我这样的怪物。这个代码可能会有所帮助

 class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate,UISearchResultsUpdating { @IBOutlet weak var tblView: UITableView! var tabledata = ["lucques","chickendijon","godaddy","amazon","chris","ambata","bankofamerica","abelcine","AUTO + TRANSPORTATION","BILLS + UTILITIES","FOOD + DINING","HEALTH","AutoCare", "Auto Payment" , "Gas+Fuel","Electric Bill", "Internet/Television","Fast Foodd", "Gorceries" , "Restaurants","Gym Membership", "Health Insurance","auto","note-bullet","knife","heart"] var filteredTableData = [String]() var resultSearchController = UISearchController() override func viewDidLoad() { super.viewDidLoad() tblView.delegate = self tblView.dataSource = self self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.searchBar.sizeToFit() controller.searchBar.barStyle = UIBarStyle.Black controller.searchBar.barTintColor = UIColor.whiteColor() controller.searchBar.backgroundColor = UIColor.clearColor() self.tblView.tableHeaderView = controller.searchBar return controller })() self.tblView.reloadData() } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if self.resultSearchController.active { return self.filteredTableData.count }else{ return self.tabledata.count } } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var section = indexPath.section var row = indexPath.row let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:"addCategoryCell") cell.selectionStyle = UITableViewCellSelectionStyle.None cell.backgroundColor = UIColor.clearColor() cell.contentView.backgroundColor = UIColor.clearColor() cell.textLabel?.textAlignment = NSTextAlignment.Left cell.textLabel?.textColor = UIColor.blackColor() cell.textLabel?.font = UIFont.systemFontOfSize(14.0) if self.resultSearchController.active { cell.textLabel?.text = filteredTableData[indexPath.row] } else { cell.textLabel?.text = tabledata[indexPath.row] } return cell } func updateSearchResultsForSearchController(searchController: UISearchController) { filteredTableData.removeAll(keepCapacity: false) let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text) let array = (tabledata as NSArray).filteredArrayUsingPredicate(searchPredicate) filteredTableData = array as! [String] self.tblView.reloadData() } } 

对于那些在实现这一点的所有方面寻找更多的上下文,这里是一个关于如何实现UISearchController

除了Andy Ibanez的上述回答之外,还需要将代码添加到UITableViewDataSource方法中,以便在tableview中显示新过滤的结果。

另外,不要忘记在你的updateSearchResults方法中调用tableView.reloadData() – UISearchController不会自动告诉tableView重载数据。