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数据,分如下几步: > 将 ...
随机推荐
- [Javascript] Get Started with LeafletJS Mapping
Leaflet makes creating maps in the browser dead simple. With some HTML and 3 lines of JavaScript, we ...
- WPF柱状图(支持数据库动态更新)
之前我们讲到wpf组件基类以及组件开发,现在我们围绕之前的内容去开发一个组件. 效果图请加群查看,在群共享里面. 做出这个呢 是比较繁琐的. 首先要使用我们的基类 继承基类的模板自动生成如下几个文件 ...
- 读写应用程序数据-SQLite3
SQLite3是嵌入到ios中的关系型数据库.对存储大规模的数据非常实用,使得不必将每个对象加到内存中. 支持NULL.INTEGER.REAL(浮点数字).TEXT(字符串和文本).BLOB(二进制 ...
- 关于IB_DESIGNABLE / IBInspectable的那些事
前言 IB_DESIGNABLE / IBInspectable 这两个关键字是在WWDC 2014年”What’s New in Interface Builder”这个Session里面,用Swi ...
- 玩转Android之Drawable的使用
Drawable天天用,可你是否对Drawable家族有一个完整的认知?今天我们就来系统的学习一下Drawable的使用. 1.概述 用过Drawable的筒子都知道Drawable有很多种,有的时候 ...
- springmvc 双亲上下文导致的 No mapping found for HTTP request
今天搭建spring mvc ,结果发出请求总是No mapping found for HTTP request with URI [******] 于是开始排查了半天,后来在网上搜到了双亲上下文的 ...
- 纯js写“运动”框架
所谓“运动”不一定真的是运动,在连续的一段时间内改变某一样式都可以成为“运动”. 先写几个会用到的函数 //获取某一元素的指定样式 function getstyle (element, target ...
- C#垃圾回收机制详解
一.托管代码/非托管代码 C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响. 托 ...
- T-SQL基础 (存储过程,触发器|| 笔记0808)
一:存储过程 1.使用EXEC 调用存储过程 2.系统存储过程是以SP_开头,SP_ProcedureName.:例子:EXEC sp_columns TableName 查看列信息 扩展存储过程 ...
- Touch事件or手机卫士面试题整理回答(二)
Touch事件or手机卫士面试题整理回答(二) 自定义控件 1. Touch事件的传递机制 顶级View->父View->子View,不处理逆向返回 OnInterceptTouchEve ...