UISearchBar -- 备忘
搜索功能的备忘
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 -- 备忘的更多相关文章
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
- php 相关模块备忘
在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因
近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...
随机推荐
- 赵雅智:js知识点汇总
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhpMjEyOQ==/font/5a6L5L2T/fontsize/400/fill/I0 ...
- CSS3超酷移动手机滑动隐藏側边栏菜单特效
这是一组共4种效果很炫酷的CSS3移动手机滑动隐藏側边栏菜单特效. 这四种效果各自是:默认的点击滑动側边栏菜单效果.带3D transforms的滑动側边栏效果.文字缩放和淡入淡出效果的滑动側边栏以及 ...
- 第一章建立asp.net MVC
第一步 第二步 创建controller 创建View view和controller之间的关系
- ios开发时候,出现A valid provisioning profile for this executable was not found 错误
今天一大早起来,做ios的开发,发现了一下错误:A valid provisioning profile for this executable was not found 错误的产生是在开发模式下产 ...
- javascript进击(五)JS对象
JavaScript中是所有事物都是对象.JavaScript允许自定义对象. 对象是带有属性和方法的特殊数据类型. 访问对象的属性: 常见属性 访问对象的方法: 常用方法 (创建JavaScript ...
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
今天把notice表中的content字段改为long字段后,含有该字段的使用CTE的查询语句报错了.提示一下错误 ### Cause: java.sql.SQLException: 流已被关闭 ; ...
- Linux C —— 多线程
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5769417. ...
- Ubuntu server搭建vsftpd小记
Ubuntu server中搭建vsftpd小记 <h1> 在Ubuntu server中安装vsftpd</h1> sudo apt-get install vsftpd & ...
- C# 右键菜单 contextMenuStrip
1.添加contextMenuStrip控件 默认命名:contextMenuStrip1 2.在要显示的控件上,找到其ContextMenuStrip属性,并设置其为contextMenuStrip ...
- sdk 提示至少需要Build-tools 19.1.0以上的解决方式
网上搜了很多办法,例如修改host文件或者设置sdk manager tool 为force方式都解决不了,最简单的方式是手动下载build-tools下的包,例如直接百度搜索build-tools ...