由于UISearchDisplayController本身就整合了搜索条和表格,所以使用UISearchDisplayController来实现带有搜索功能的列表很方便。到了iOS8,苹果废除UISearchDisplayController,建议我们使用UISearchController配合UITableView来实现。我们可以把搜索条放在表格头部,或者放在页面顶部,还是很灵活的。下面通过代码演示如何使用UISearchController实现具有搜索功能的表格。关于UISearchDisplayController的使用方法,可以参考文章“Swift - 带结果列表的搜索条(UISearchDisplayController)的用法”。
直接上代码如下:
(注:这里对ViewController做了类扩展ViewControllerExtensions.swift,把UITableView和UISearchController的代理方法都写在扩展类里,使代码更加简洁)
import Foundation
import UIKit
@available(iOS 8.0, *)
extension ViewController: UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.countrySearchController.active) {
return self.searchArray.count
}
else {
return self.schoolArray.count
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//为了提供表格显示性能,已创建完成的单元需重复使用
let identify:String = "MyCell"
//同一形式的单元格重复使用,在声明时已注册
let cell = tableView.dequeueReusableCellWithIdentifier(identify, forIndexPath: indexPath)
if (self.countrySearchController.active) {
cell.textLabel?.text = self.searchArray[indexPath.row]
return cell
}
else {
cell.textLabel?.text = self.schoolArray[indexPath.row]
return cell
}
}
}
@available(iOS 8.0, *)
extension ViewController: UITableViewDelegate {
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
}
@available(iOS 8.0, *)
extension ViewController: UISearchResultsUpdating {
@available(iOS 8.0, *)
func updateSearchResultsForSearchController(searchController: UISearchController) {
self.searchArray.removeAll(keepCapacity: false)
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (self.schoolArray as NSArray).filteredArrayUsingPredicate(searchPredicate)
self.searchArray = array as! [String]
}
}
import UIKit
@available(iOS 8.0, *)
class ViewController: UIViewController {
//展示列表
var tableView: UITableView!
//搜索控制器
var countrySearchController = UISearchController()
//原始数据集
let schoolArray = ["清华大学","北京大学","中国人民大学","北京交通大学","北京工业大学","北京航空航天大学","北京理工大学","北京科技大学","中国政法大学","中央财经大学","华北电力大学","北京体育大学","上海外国语大学","复旦大学","华东师范大学","上海大学","河北工业大学"]
//搜索过滤后的结果集
var searchArray:[String] = [String](){
didSet {self.tableView.reloadData()}
}
override func viewDidLoad() {
super.viewDidLoad()
//创建表视图
self.tableView = UITableView(frame: UIScreen.mainScreen().applicationFrame, style:UITableViewStyle.Plain)
self.tableView!.delegate = self
self.tableView!.dataSource = self
//创建一个重用的单元格
self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
self.view.addSubview(self.tableView!)
//配置搜索控制器
self.countrySearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.hidesNavigationBarDuringPresentation = false
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.searchBarStyle = .Minimal
controller.searchBar.sizeToFit()
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}