UISearchController - 搜索控制器
2016-03-09 16:48
477 查看
搜索控制器(简称UISC)
1、概述
一个UISC对象管理基于searchBar的搜索结果的展示。UISC对象通常与两个自定义的 view controller一起工作,第一个显示可搜索的内容,第二个显示搜索结果。第一个VC是主界面的一部分,第二个是你通过initWithSearchResultsController:初始化的VC。UISC对象包含一个UISearchBar对象(searchBar),你必须把他分配给第一个view controller用来展示,UIC通常和 UITableView 一起来实现搜索功能,可以把UITableView的属性tableHeadView 设置为searchBar。
当你和search bar 交互的时候,UISC会通知它的属性searchResultsUpdater其遵循UISearchResultsUpdating 协议,你可以用该协议提供的方法搜索内容,并把搜索结果发送给results view controller。
2、属性 active
当用户点击搜索区域的时候,search controller 就会自动展示 search results controller( 搜索结果控制器),可以通过此值来判断搜索结果控制器是否已经展示出来。if searchController.active { return searchList.count } return dataList.count }
3、属性 searchResultsController
当此值为nil的时候, search controller不会用单独的view controller 来展示搜索结果,这时候应该用包含搜索框和可搜索内容的view controller 来展示。4、属性 searchBar:UISearchBar {get}
在展示搜索内容之前,应该把此 searchBar 显示在主控制器界面上。其为搜索内容的开始点。如果要自定义一个UISearchBar, 应该子类化UISearchController,进一步定制searchBar。5、使用步骤
1)创建UISearchController实例(searchController)//初始化searchController,如果searchResultsController设置为nil,那么将会用展示可搜索内容的vc来展示搜索结果 searchController = UISearchController(searchResultsController: nil)
2)设置searchController代理
//设置代理,其遵循UISearchControllerDelegate协议 searchController.delegate = self //设置搜索结果的更新者,其遵循UISearchResultsUpdating协议 searchController.searchResultsUpdater = self
3)设置searchController属性
//搜索时,背景模糊 searchController.obscuresBackgroundDuringPresentation = false //搜索时,背景变暗 searchController.dimsBackgroundDuringPresentation = false //搜索时,隐藏导航条 searchController.hidesNavigationBarDuringPresentation = false
4)实现代理方法
//实现UISearchResultsUpdating协议方法 updateSearchResultsForSearchController(searchController: UISearchController) {}
//根据需要实现UISearchControllerDelegate协议方法 willPresentSearchController(searchController: UISearchController) {} didPresentSearchController(searchController: UISearchController) {} willDismissSearchController(searchController: UISearchController) {} didDismissSearchController(searchController: UISearchController) {} presentSearchController(searchController: UISearchController) {}
UISearchControllerDelegate几个方法的执行顺序:
presentSearchController
willPresentSearchController
willDismissSearchController
didDismissSearchController
具体参考下图:
6、示例
例子采用UITableView + UISearchController 来实现一个简单的数字搜索功能。完整代码如下:
// // ViewController.swift // UISearchControllerDemo // // Created by fengsh on 16/3/9. // Copyright © 2016年 fengsh. All rights reserved. // import UIKit class ViewController: UIViewController { // 表格 var tableView: UITableView! //搜索控制器 var searchController: UISearchController! //数据 var dataList: [String]! //搜索结果数据 var searchList: [String] = [] { //更新搜索结果数据的时候tableView重新加载 didSet { tableView.reloadData() } } let indentifier = "cell" override func viewDidLoad() { super.viewDidLoad() initData() let rect = CGRect(x: 0, y: 20, width: self.view.bounds.width, height: self.view.bounds.height) tableView = UITableView(frame: rect, style: UITableViewStyle.Plain) //注册复用的单元格 tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: self.indentifier) //设置tableView的代理,其遵循UITableViewDelegate协议 tableView.delegate = self //设置tableView的数据源,其遵循UITableViewDataSource协议 tableView.dataSource = self self.view.addSubview(tableView) //初始化searchController,如果searchResultsController设置为nil,那么将会用展示可搜索内容的vc来展示搜索结果 searchController = UISearchController(searchResultsController: nil) //设置代理,其遵循UISearchControllerDelegate协议 searchController.delegate = self //设置搜索结果的更新者,其遵循UISearchResultsUpdating协议 searchController.searchResultsUpdater = self //搜索时,背景模糊 searchController.obscuresBackgroundDuringPresentation = false //搜索时,背景变暗 searchController.dimsBackgroundDuringPresentation = false //搜索时,隐藏导航条 searchController.hidesNavigationBarDuringPresentation = false //搜索条显示在头部 tableView.tableHeaderView = searchController.searchBar } // 初始化数据 func initData() { dataList = [] for var i = 0; i < 20; i++ { //randomNumber是一个随机整数 let randomNumber = arc4random() let str = String(randomNumber) dataList.append(str) } } } //MARK:----实现UITableViewDataSource协议 extension Vi c1ad ewController: UITableViewDataSource { //配置多少个分组 func numberOfSectionsInTableView(tableView: UITableView) -> Int { //如果用户点击了搜索区域,那么active = true if searchController.active { return searchList.count } return dataList.count } //配置每个分组有多少个单元格 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } //配置每个单元格 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(self.indentifier, forIndexPath: indexPath) if searchController.active { cell.textLabel?.text = searchList[indexPath.section] } else { cell.textLabel?.text = dataList[indexPath.section] } return cell } } //MARK:----实现UITableViewDelegate协议 extension ViewController: UITableViewDelegate { func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { } } //MARK:----实现UISearchResultsUpdating协议 extension ViewController: UISearchResultsUpdating { func updateSearchResultsForSearchController(searchController: UISearchController) { searchList = dataList.filter{ $0.containsString(searchController.searchBar.text!)} } } //MARK:----实现UISearchControllerDelegate协议 extension ViewController: UISearchControllerDelegate { func willPresentSearchController(searchController: UISearchController) { print("willPresentSearchController") } func didPresentSearchController(searchController: UISearchController) { print("didPresentSearchController") } func willDismissSearchController(searchController: UISearchController) { print("willDismissSearchController") } func didDismissSearchController(searchController: UISearchController) { print("didDismissSearchController") } func presentSearchController(searchController: UISearchController) { print("presentSearchController") } }
相关文章推荐
- request.getParameterMap()获得Map中的数据时
- Message queue
- NDK Build 用法(NDK Build)
- 問題排查:行動裝置網頁前端 UI 設計 (1)
- IOS学习之UIActionSheet的使用
- UI线程安全及Handler消息传递机制
- Result Maps collection already contains value for XXX
- query
- 在Archive项目 时,出现了“Yourbuild settings specify a provisioning profile with the UUID “”
- Please set 'request_order' ini value to include C,G and P (recommended: 'CGP') in php.ini
- UITextField输入内容时闪烁,输入内容位置向下偏移
- String、StringBuffer与StringBuilder之间区别(转)
- String、StringBuffer与StringBuilder之间区别
- 96. Unique Binary Search Trees(I 和 II)
- iOS 利用UISCrollView作广告自动轮播效果
- 太原UI设计师郭文军讲网页设计及web前端网页宽度要求?
- 【LeetCOde】62. Unique Paths
- QueryRunner 之 query函数
- 错误"Invalid value around character 0"
- 双向map,通过value找到key,还有...