本示例使用搜索控制器来过滤表视图控制器中的单元格。搜索栏位于表格视图的标题视图内部。表格视图的内容以与搜索栏相同的高度偏移,因此首先隐藏了搜索栏。向上滚动超过表格视图的顶部边缘时,将显示搜索栏。然后,当搜索栏变为活动状态时,它会隐藏导航栏。
将UITableViewController嵌入到UINavigationController中,以获取UINavigationItem(包含导航栏)。然后将我们的自定义ViewController类设置为继承自UITableViewController并采用UISearchResultsUpdating协议。
class ViewController: UITableViewController, UISearchResultsUpdating {
let entries = [(title: "Easiest", image: "green_circle"),
(title: "Intermediate", image: "blue_square"),
(title: "Advanced", image: "black_diamond"),
(title: "Expert Only", image: "double_black_diamond")]
// 一个空的元组,将使用搜索结果进行更新。
var searchResults : [(title: String, image: String)] = []
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater= self
self.definesPresentationContext= true
// 将搜索栏放置在表格视图的标题中。
self.tableView.tableHeaderView = searchController.searchBar
// 将内容偏移设置为搜索栏高度的高度
// 在首次显示视图时将其隐藏。
self.tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.height)
}
func filterContent(for searchText: String) {
// 使用匹配项更新searchResults数组
// 在我们基于标题值的条目中。
searchResults = entries.filter({ (title: String, image: String) -> Bool in
let match = title.range(of: searchText, options: .caseInsensitive)
// 如果范围包含匹配项,则返回元组。
return match != nil
})
}
// 标记:-UISearchResultsUpdating方法
func updateSearchResults(for searchController: UISearchController) {
// 如果搜索栏包含文本,请使用字符串过滤数据
if let searchText = searchController.searchBar.text {
filterContent(for: searchText)
// 用搜索结果数据重新加载表视图。
tableView.reloadData()
}
}
// 标记:-UITableViewController方法
override func numberOfSections(in tableView: UITableView) -> Int { return 1 }
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// 如果搜索栏处于活动状态,请使用searchResults数据。
returnsearchController.isActive?searchResults.count: entries.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 如果搜索栏处于活动状态,请使用searchResults数据。
let entry =searchController.isActive?
searchResults[indexPath.row] : entries[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = entry.title
cell.imageView?.image = UIImage(named: entry.image)
return cell
}
}