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数据,分如下几步: > 将 ...
随机推荐
- rsync服务安装
1. rsync是开源的项目,首先去官网上下载安装包.下载地址 http://rsync.samba.org/ftp/rsync/src/ 这边我下载的是3.1.0.tar.gz 解压到/opt/r ...
- java15 IO装饰设计模式
IO装饰设计模式:(IO中使用了装饰设计模式) 节点流可以直接从源读取数据,处理流就是对节点流的包装,这就是装饰,装饰就是对原有的流的性能的提升.比如买的车,马力不够,就进行装饰,使其马力增大. 装饰 ...
- MYSQL----myownstars(102)
http://blog.itpub.net/15480802/cid-84815-list-1/
- InnoDB的redo日志管理---饶珑辉
http://raolonghui.com/2015/06/24/innodb%E7%9A%84redo%E6%97%A5%E5%BF%97%E7%AE%A1%E7%90%86/#comment-11
- Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例
1. 复制多级文件夹的案例 需求:复制多级文件夹 数据源:E:\JavaSE\day21\code\demos 目的地:E:\ 分析: A:封装数据源File ...
- css-position的相关用法
简介 position用于固定位置,是尤为重要的一个属性 其值可以为: static: 默认值,忽略top, bottom, left, right 或者 z-index 声明 relative: 相 ...
- Integer跟int的区别(备份回忆)
int与Integer的区别 int 是基本数据类型Integer是其包装类,注意是一个类.为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用.否则 你无法直接通过变量转化.比如, ...
- Unity3D 之3D游戏SD快打 3D游戏基础入门开发全(1)
这里记录一个U3D游戏,3D游戏的基本开发. 导入素材 1.首先导入需要的素材.因为FBX格式的素材是通用的,所以尽量导入这样的资源使用 导入后的结果: 然后对人形骨骼进行设置. 看哪里没有映射到骨骼 ...
- java log日志的输出。
在Spring框架中添加日志功能: pom.xml <dependency> <groupId>log4j</groupId> <artifactId> ...
- Objective-C 中的方法回掉
Objective-C 中的方法回掉 Objective-C 中的方法调用 OC 类似C+,避免不了的内部的各种通信手段,函数调用,变量传递等,避免不了各种回掉等. 一.class直接调用 或者 o ...