美文网首页
9.5、UISearchController

9.5、UISearchController

作者: 艾希_可可 | 来源:发表于2018-06-27 13:24 被阅读10次

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()

}

}

相关文章

网友评论

      本文标题:9.5、UISearchController

      本文链接:https://www.haomeiwen.com/subject/vxubyftx.html