定义
//声明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]
}
}
网友评论