UISearchController

定义

//声明UISearchController
var searchController: UISearchController!
//声明数组存储搜索结果
var searchResults: [AreaMO] = []

初始化

//设置tableview的自动调整
if #available(iOS 11, *) {
    self.tableView.contentInsetAdjustmentBehavior = .always
} else {
    self.automaticallyAdjustsScrollViewInsets = true
}
//设置包括bar的扩展
self.extendedLayoutIncludesOpaqueBars = true
//push到下一个页面后自动隐藏searchbar
self.definesPresentationContext = true
//和上一行代码一起共同解决了点击取消后的动画问题!!!
self.edgesForExtendedLayout = .init(rawValue: 0)
//初始化
searchController = UISearchController(searchResultsController: nil)
//开始搜索后是否隐藏背景内容(默认隐藏,即用模板盖住,无法点击内容)
searchController.dimsBackgroundDuringPresentation = false
//开始搜索后是否隐藏navbar (默认隐藏,隐藏可能会出现动画问题,修改此项关闭)
searchController.hidesNavigationBarDuringPresentation = true
//设置代理
searchController.searchResultsUpdater = self
//设置背景色(通过此项设置背景色,而不是backgroundColor)
searchController.searchBar.barTintColor = UIColor.groupTableViewBackground
//去掉上下黑线(searchbar上下自带两行黑线,使用设置边框跟背景色相同的方式去掉黑线,直接去掉边框不行)
searchController.searchBar.layer.borderWidth = 1
searchController.searchBar.layer.borderColor = UIColor.groupTableViewBackground.cgColor
//将headerview设置成searchbar
tableView.tableHeaderView = searchController.searchBar

查询方法

//参数为searchbar内容

func searchFilter(text: String) {
    searchResults = areas.filter({ (area) -> Bool in
          //忽略大小写匹配
        return (area.name!.localizedCaseInsensitiveContains(text))
    })
}

tableview相关代码修改

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    //搜索框正在编辑,即正在查询时,显示查询内容数目
    return searchController.isActive ? searchResults.count : areas.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "areaCustomCell", for: indexPath) as! AreaCustomTableViewCell
    //搜索框正在编辑,即正在查询时,显示查询内容
    let area = searchController.isActive ? searchResults[indexPath.row] : areas[indexPath.row]
    ...
    return cell
}

UISearchResultsUpdating代理方法

遵循UISearchResultsUpdating协议

func updateSearchResults(for searchController: UISearchController) {
    //判断是否有搜索内容
    if var text = searchController.searchBar.text {
        //过滤首末尾空格(此方法不能过滤中间)
        text = text.trimmingCharacters(in: .whitespaces)
        //调用查找方法
        searchFilter(text: text)
        //重新加载tableview
        tableView.reloadData()
    }
}

点击进入下一页面

正在搜索时点选传入搜索结果对象到下一页面

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        let dest = segue.destination as! DetailTableViewController
        //判断是否正在搜索,如果是传入搜索结果数组中对象,否则传入源数据中对象
        dest.area = searchController.isActive ? self.searchResults[self.tableView.indexPathForSelectedRow!.row] : self.areas[self.tableView.indexPathForSelectedRow!.row]
    }
}

你可能感兴趣的:(UISearchController)