import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchControllerDelegate, UISearchResultsUpdating {
//数组
var dataArray: NSMutableArray?
//表格
var tbView: UITableView?
//搜索
var searchCtrl: UISearchController?
//区分显示搜索结果还是正常的列表
var isSearch: Bool?
//搜索结果的数组
lazy var resultArray = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
//1.数据源数组
self.createData()
//2.表格
self.createTableView()
//3.遵守协议,实现代理方法
//搜索
self.createSearch()
}
//数据源数组
func createData(){
self.dataArray = NSMutableArray()
//97-123
for i in 65..<91 {
//创建每一个组的数组
let sectionArray = NSMutableArray()
for j in 0..<6 {
let str = String(format: "第%c组第%i个", i, j)
//下面的写法和上面是等价的
//let str = String(format: "第%c组第%i个", arguments: [i,j])
sectionArray.add(str)
}
self.dataArray?.add(sectionArray)
}
}
let DeviceWidth = UIScreen.main.bounds.width
let DeviceHeight = UIScreen.main.bounds.height
//表格
func createTableView(){
self.automaticallyAdjustsScrollViewInsets = false
tbView = UITableView(frame: CGRect(x: 0, y: 64, width: DeviceWidth, height: DeviceHeight-64), style: .plain)
tbView?.delegate = self
tbView?.dataSource = self
self.view.addSubview(tbView!)
}
//添加搜索的功能
func createSearch(){
//iOS7之前 UISearchBar+UISearchDisplayer
//iOS7之后 UISearchController
//1.创建UISearchController对象
//参数:在哪个视图控制解密那显示搜索结果
self.searchCtrl = UISearchController(searchResultsController: nil)
//设置代理
self.searchCtrl?.delegate = self
//设置修改搜索结果数据的代理
self.searchCtrl?.searchResultsUpdater = self
//是否隐藏导航条
self.searchCtrl!.hidesNavigationBarDuringPresentation = false
//是否显示阴影
self.searchCtrl!.dimsBackgroundDuringPresentation = false
//UISearchController默认创建了一个UISearchBar对象(搜索框)
//显示搜索框
self.searchCtrl!.searchBar.sizeToFit()
//显示到表格的最上面
self.tbView?.tableHeaderView = self.searchCtrl!.searchBar
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
//MARK: UITableView代理
extension ViewController{
//返回多少个组
func numberOfSections(in tableView: UITableView) -> Int {
if self.isSearch == true {
//搜索结果只显示一个section
return 1
}else{
//列表
return (self.dataArray?.count)!
}
}
//返回每个组有多少行
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.isSearch == true {
//搜索结果
return self.resultArray.count
}else{
//获取子数组
let sectionArray = self.dataArray![section] as! NSArray
return sectionArray.count
}
}
//返回每一行的视图
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//重用标志
let cellId = "cellId"
//从重用队列获取cell
var cell = tableView.dequeueReusableCell(withIdentifier: cellId)
if nil == cell {
//获取不到,创建新的cell
cell = UITableViewCell(style: .default, reuseIdentifier: cellId)
}
if self.isSearch == true {
//搜索结果
let str = self.resultArray[indexPath.row] as! String
cell?.textLabel?.text = str
}else{
//获取数据
let sectionArray = self.dataArray![indexPath.section] as! NSArray
let str = sectionArray[indexPath.row] as! String
cell?.textLabel?.text = str
}
return cell!
}
//返回每一组的标题
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if self.isSearch == true {
return "搜索结果"
}else{
let str = String(format: "第%c组", arguments: [section+65])
return str
}
}
//表格的索引
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
var array = [String]()
//搜索框
array.append(UITableViewIndexSearch)
for i in 65..<91 {
let str = String(format: "%c", i)
array.append(str)
}
//tableView.scrollToRowAtIndexPath(<#T##indexPath: NSIndexPath##NSIndexPath#>, atScrollPosition: <#T##UITableViewScrollPosition#>, animated: <#T##Bool#>)
return array
}
//返回索引对应的section的序号
func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
//index是索引字符串的序号
if index == 0 {
//搜索
tableView.contentOffset = CGPoint.zero
return -1
}else{
return index-1
}
}
}
//MARK: UISearchController代理
extension ViewController{
//显示搜索结果的时候调用
func willPresentSearchController(_ searchController: UISearchController) {
//修改为显示搜索结果的状态
self.isSearch = true
//刷新表格
self.tbView?.reloadData()
}
//退出搜索结果的状态
func willDismissSearchController(_ searchController: UISearchController) {
//回到正常状态
self.isSearch = false
//刷新表格
self.tbView?.reloadData()
}
//确定搜索结果显示的数据
func updateSearchResults(for searchController: UISearchController) {
//搜索条件
let filterString = searchController.searchBar.text
//删除之前的数据
self.resultArray.removeAllObjects()
//遍历数据源数组,找到符合条件的数据
for tmpArray in self.dataArray! {
//每个组(section)的数据源数组
let sectionArray = tmpArray as! NSArray
for tmpStr in sectionArray{
let str = tmpStr as! String
//CaseInsensitiveSearch->大小写不敏感
/*
第一个参数:被包含的字符串
第二个参数:查找字符串的规则
第三个参数:查找的范围
*/
let range = str.range(of: filterString!, options: .caseInsensitive, range: nil, locale: nil)
if range?.lowerBound != nil {
//包含搜索框里面的字符串
self.resultArray.add(str)
}
}
}
//刷新表格
self.tbView?.reloadData()
}
}
网友评论