搜索功能的备忘

UISearchBar

UISearchBar是一个搜索栏,继承自UIView,也是常用的控件之一,所以特别写一篇备忘方便以后做工具文章。

例子:

        let searchBar = UISearchBar(frame: CGRectMake(0, 64, view.frame.size.width, 40))
searchBar.barStyle = .Default
searchBar.placeholder = "请输入一些内容"
searchBar.showsCancelButton = true
searchBar.showsSearchResultsButton = true
searchBar.tintColor = UIColor.orangeColor()
searchBar.showsScopeBar = true
searchBar.scopeButtonTitles = ["分组1", "分组2"]
searchBar.selectedScopeButtonIndex = 1
searchBar.delegate = self view.addSubview(searchBar)

一些常用的属性方法(更多请参考官方文档):

  • barStyle:搜索栏风格,(default, black)。
  • text:搜索栏内的文字。
  • placeholder:占位文字。
  • showsCanclButton:是否显示取消按钮。
  • tintColor:光标颜色。
  • barTintColor:搜索栏背景颜色。
  • showsScopeBar:是否显示附加按钮视图。
  • scopeButtonTitles:设置了showsScopeBar后 可以设置每个按钮的title。
  • selectedScopeButtonIndex:应该选中那个附加按钮。
  • inputAccessoryView:键盘的附加视图。
  • backgroundImage:搜索栏的背景图片。
  • setShowsCancelButton(Bool, animated: Bool):是否显示取消按钮,可以使用动画。
  • setBackgroundImage(UIImage?, forBarPosition: UIBarPosition, barMetrics: UIBarMetrics):设置背景图片。
  • backgroundImageForBarPosition(UIBarPosition, barMetrics: UIBarMetrics):获取背景图片。

代理方法:

    // 是否应该开始编辑
func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
return true
} // 搜索栏开始编辑的回调
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
print("begin editing")
} // 是否应该结束编辑
func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool {
return true
} // 搜索栏结束编辑的回调
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
print("end editing")
} // 当搜索栏内的文字发生变化时调用,返回是否允许改变。
func searchBar(searchBar: UISearchBar, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
print("\(range), \(text)")
return true
} // 取消按钮点击事件
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
print("cancel button click")
searchBar.text = nil
searchBar.resignFirstResponder()
} // 点击了搜索按钮的回调
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
print("search button click")
searchBar.resignFirstResponder()
} // 搜索结果列表按钮被点击
func searchBarResultsListButtonClicked(searchBar: UISearchBar) {
print("results list click")
} // 当搜索栏的内容已经发生变化时调用
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
print(searchText)
} // 点击了附加视图按钮后调用
func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
print(selectedScope)
}

UISearchDisplayController

需要注意的是 UISearchDisplayController并非继承于UIViewController 而是NSObject,所以它单靠本身不具备展示功能。

例子:

首先先声明需要的属性。

    // MARK: 属性
let identifier = "cellIdentifier"
weak var tableview: UITableView!
var searchController: UISearchDisplayController!
let datas = ["Alex", "Alice", "Alisa", "Andy", "Jack", "Ben", "Tom", "Jerry", "Edward", "Daniel", "Amy", "Anne", "Alan", "Danny", "Tony", "Tim", "Van", "Zack"]
var filterDatas: [String]?

创建tableview,searchbar,searchdisplaycontroller,并建立相关关系 设置代理和数据源。

    override func viewDidLoad() {
super.viewDidLoad() // 创建tableview
createTableview() // 创建搜索控制器
createSearchDisplayController()
} func createTableview() {
let tableview = UITableView(frame: CGRectMake(0, 0, view.frame.size.width, view.frame.size.height), style: .Plain)
tableview.dataSource = self
tableview.delegate = self
tableview.registerClass(UITableViewCell.self, forCellReuseIdentifier: identifier)
view.addSubview(tableview)
self.tableview = tableview
} func createSearchDisplayController() {
let searchBar = UISearchBar(frame: CGRectMake(0, 0, view.frame.size.width, 44))
searchBar.placeholder = "搜索"
tableview.tableHeaderView = searchBar let searchDisplayController = UISearchDisplayController(searchBar: searchBar, contentsController: self)
searchDisplayController.searchResultsDelegate = self
searchDisplayController.searchResultsDataSource = self
searchDisplayController.delegate = self
searchDisplayController.searchResultsTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: identifier)
searchController = searchDisplayController
}

实现tableview的数据源和代理方法,主要区分是哪个tableview

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == tableview {
return datas.count
} else {
return filterDatas == nil ? 0 : filterDatas!.count
}
} func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath)
if tableView == tableview {
cell.textLabel?.text = datas[indexPath.row]
} else {
cell.textLabel?.text = filterDatas?[indexPath.row]
}
return cell
} func scrollViewWillBeginDragging(scrollView: UIScrollView) {
if scrollView == tableview {
searchController.searchBar.resignFirstResponder()
}
}

这里看下searchdisplaycontroller的代理方法,最后一个方法用于过滤数据

    // search display controller 即将停止搜索。
func searchDisplayControllerWillEndSearch(controller: UISearchDisplayController) {
print("searchDisplayControllerWillEndSearch")
} // 即将开始搜索,当点击了searchBar时 此方法被第一个调用。
func searchDisplayControllerWillBeginSearch(controller: UISearchDisplayController) {
print("searchDisplayControllerWillBeginSearch")
} // 即将开始显示ResultsTableView。
func searchDisplayController(controller: UISearchDisplayController, willShowSearchResultsTableView tableView: UITableView) {
print("willShowSearchResultsTableView")
} // 已经开始搜索,当点击了searchBar时 此方法被第二个调用。
func searchDisplayControllerDidBeginSearch(controller: UISearchDisplayController) {
print("searchDisplayControllerDidBeginSearch")
} // search display controller 已经停止搜索。
func searchDisplayControllerDidEndSearch(controller: UISearchDisplayController) {
print("searchDisplayControllerDidEndSearch")
} // ResultsTableView已经被隐藏。
func searchDisplayController(controller: UISearchDisplayController, didHideSearchResultsTableView tableView: UITableView) {
print("didHideSearchResultsTableView")
} // 已经加载了resultTableview的回调,(注意:这并不是等resultTableview显示时才调用,而是加载了resultTableview就调用)。
func searchDisplayController(controller: UISearchDisplayController, didLoadSearchResultsTableView tableView: UITableView) {
print("didLoadSearchResultsTableView")
} // 已经显示ResultsTableView。
func searchDisplayController(controller: UISearchDisplayController, didShowSearchResultsTableView tableView: UITableView) {
print("didShowSearchResultsTableView")
} // ResultsTableView即将被隐藏。
func searchDisplayController(controller: UISearchDisplayController, willHideSearchResultsTableView tableView: UITableView) {
print("willHideSearchResultsTableView")
} // 即将卸载result tableview。
func searchDisplayController(controller: UISearchDisplayController, willUnloadSearchResultsTableView tableView: UITableView) {
print("willUnloadSearchResultsTableView")
} // 这个方法。。。还没弄清楚,没用到过

UISearchBar -- 备忘的更多相关文章

  1. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  2. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  3. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  4. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

  5. [备忘] Automatically reset Windows Update components

    这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...

  6. ECMAScript 5(ES5)中bind方法简介备忘

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  7. MFC通过txt查找文件并进行复制-备忘

    MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...

  8. php 相关模块备忘

    在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

  9. 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因

    近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...

随机推荐

  1. .Net程序猿玩转Android开发---(8)表格布局TableLayout

    表格布局TableLayout是Android中比較经常使用的一个布局控件,既然是表格,肯定有行和列,TableLayout中的行有TableRow组成.列依据每行控件的数量来确定 假如第一行有3个控 ...

  2. 多态VI的创建

    比较适合使用多态VI的场合:一个算法会应用到几种不同的数据类型上.比如读写 INI 文件的 VI,它 们既可以读写数值型的数据,也可以读写字符串.布尔等数据类型. 实现多态 VI 之前,一般先实现它的 ...

  3. 小蔡计算器 V4.0新版全新发布上线啦~欢迎大家下载使用哈~

    小蔡计算器4.0新版全新发布上线啦~欢迎大家下载使用哦~ 立即下载:http://www.zhentiyuan.com/windows/index.aspx 软件介绍:小蔡计算器4.0是一款界面优美的 ...

  4. 转:maven报错非法字符:\65279 错误

    开发中一个项目很早就报这个错,maven报错非法字符:\65279 错误,今天终于忍无可忍要解决它 :编译java文件的时候,有些java文件报非法字符 \65279错误,在网上找和很多 方法,也试了 ...

  5. mybatis错误:Invalid bound statement (not found)

    解决办法是去看看mybatis配置里面的可能因为配置为什么格式文件解析不到 <property name="mapperLocations" value="clas ...

  6. 获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)

    1 // 注意:首先要在项目中添加引用 System.Management using System; using System.Collections.Generic; using System.L ...

  7. 自定义控件学习 Day44

    自定义控件学习 Day44 onMeasure 测量控件的宽高. onLayout 设置位置 onDarw 绘制控件 问题堆栈 1. 事件监听传递 最外层获取到控件,根据事件事件传递机制,返回值fal ...

  8. Android TabHost的使用

    标签显示界面的主要特点是可以在一个窗口中显示多组标签栏的类容. 在Android系统中,每个标签栏称为一个Tab,而包含多个标签栏的内容就称为TabHost. 通过TabHost的继承结构来看,Tab ...

  9. MarkDown Pad2的一些用法

    一.标题 1.使用命令Ctrl+1 标题一 2.使用文字回车后,加上"-"号,再回车.就有如下的示例: 标题二 注意:减(-)号是用于最近的那一行文字变成标题. 二.背景 例如我要 ...

  10. kafka环境搭建2-broker集群+zookeeper集群(转)

    原文地址:http://www.jianshu.com/p/dc4770fc34b6 zookeeper集群搭建 kafka是通过zookeeper来管理集群.kafka软件包内虽然包括了一个简版的z ...