iOS - UISearchController
前言
NS_CLASS_DEPRECATED_IOS(3_0, 8_0, "UISearchDisplayController has been replaced with UISearchController")
@interface UISearchDisplayController : NSObject
@available(iOS, introduced=3.0, deprecated=8.0, message="UISearchDisplayController has been replaced with
UISearchController")
public class UISearchDisplayController : NSObject
NS_CLASS_AVAILABLE_IOS(8_0) @interface UISearchController : UIViewController
<UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>
@available(iOS 8.0, *) public class UISearchController : UIViewController,
UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning
在 iOS 8.0 以上版本中, 我们可以使用 UISearchController 来非常方便地在 UITableView 中添加搜索框. 而在之前版本中, 我们还是必须使用 UISearchDisplayController + UISearchBar 的组合方式.
我们创建的 tableView 和搜索控制器创建的 tableView 都会走代理方法,需要在代理方法中判断响应代理方法的 tableView 是哪一个,如果响应代理方法的 tableView 不是我创建的,说明一定是搜索控制器创建的。在 iOS 8.0 以下版本中需使用 tableView == myTableView 判断,在 iOS 8.0 以上版本中需使用 mySearchController.active 判断。
1、搜索框的创建
1.1 在 iOS 8.0 以下版本中
Objective-C
遵守协议 UISearchDisplayDelegate
搜索结果数组初始化
// 声明搜索结果存放数组
@property(nonatomic, retain)NSMutableArray *mySearchResultArray; // 初始化搜索结果存放数组
mySearchResultArray = [[NSMutableArray alloc] init];
searchDisplayController 初始化
// 声明搜索控制器,自带一个表格视图,用来展示搜索结果,必须设置为全局变量
@property(nonatomic, retain)UISearchDisplayController *mySearchDisplayController; // 实例化搜索条
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; // 实例化搜索控制器对象
mySearchDisplayController = [[UISearchDisplayController alloc]
initWithSearchBar:searchBar
contentsController:self];
// 设置搜索控制器的代理
mySearchDisplayController.delegate = self; // 为搜索控制器自带 tableView 指定代理
mySearchDisplayController.searchResultsDelegate = self;
mySearchDisplayController.searchResultsDataSource = self; // 将搜索条设置为 tableView 的表头
myTableView.tableHeaderView = searchBar;
UISearchDisplayDelegate 协议方法
// 更新搜索结果
/*
只要搜索框的文字发生了改变,这个方法就会触发。searchString 为搜索框内输入的内容。
*/
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { // 清空上一次搜索的内容
[mySearchResultArray removeAllObjects]; // 将搜索的结果存放到数组中
for (NSArray *subArray in myDataArray) {
for (NSString *str in subArray) { NSRange range = [str rangeOfString:searchString]; if (range.length) {
[mySearchResultArray addObject:str];
}
}
}
return YES;
}
UITableView 协议方法
// 设置分段头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (tableView == myTableView) {
return [NSString stringWithFormat:@"%c", (char)('A' + section)];
}
return @"搜索结果";
} // 设置分段数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (tableView == myTableView) {
return myDataArray.count;
}
return 1;
} // 设置行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == myTableView) {
return [[myDataArray objectAtIndex:section] count];
}
return mySearchResultArray.count;
} // 设置每段显示的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testIdentifier"]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"testIdentifier"];
} if (tableView == myTableView) {
cell.textLabel.text = [[myDataArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
}
else {
cell.textLabel.text = [mySearchResultArray objectAtIndex:indexPath.row];
} return cell;
}
Swift
遵守协议 UISearchDisplayDelegate
搜索结果数组初始化
// 初始化搜索结果存放数组
var mySearchResultArray:[String] = Array()
searchDisplayController 初始化
// 声明搜索控制器,自带一个表格视图,用来展示搜索结果,必须设置为全局变量
var mySearchDisplayController:UISearchDisplayController! // 实例化搜索条
let searchBar:UISearchBar = UISearchBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 44)) // 实例化搜索控制器对象
mySearchDisplayController = UISearchDisplayController(searchBar: searchBar,
contentsController: self) // 设置搜索控制器的代理
mySearchDisplayController.delegate = self // 为搜索控制器自带 tableView 指定代理
mySearchDisplayController.searchResultsDelegate = self
mySearchDisplayController.searchResultsDataSource = self // 将搜索条设置为 tableView 的表头
myTableView.tableHeaderView = searchBar
UISearchDisplayDelegate 协议方法
// 更新搜索结果
/*
只要搜索框的文字发生了改变,这个方法就会触发。searchString 为搜索框内输入的内容
*/
func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool { // 清空上一次搜索的内容
mySearchResultArray.removeAll() // 将搜索的结果存放到数组中
for subArray in myDataArray {
for str in subArray { let range:NSRange = (str as NSString).rangeOfString(searchString!) if range.length != 0 {
mySearchResultArray.append(str)
}
}
} return true
}
UITableView 协议方法
// 设置分段头标题
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { if tableView == myTableView {
return "\(Character(UnicodeScalar(65 + section)))"
}
return "搜索结果"
} // 设置分段数
func numberOfSectionsInTableView(tableView: UITableView) -> Int { if tableView == myTableView {
return myDataArray.count
}
return 1
} // 设置行数
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if tableView == myTableView { return myDataArray[section].count
}
return mySearchResultArray.count
} // 设置每段显示的内容
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("testIdentifier") if cell == nil {
cell = UITableViewCell(style: .Default, reuseIdentifier: "testIdentifier")
} if tableView == myTableView {
cell!.textLabel?.text = myDataArray[indexPath.section][indexPath.row]
}
else {
cell!.textLabel?.text = mySearchResultArray[indexPath.row]
} return cell!
}
1.2 在 iOS 8.0 及以上版本中
Objective-C
遵守协议 UISearchResultsUpdating
搜索结果数组初始化
// 声明搜索结果存放数组
@property(nonatomic, retain)NSMutableArray *mySearchResultArray; // 初始化搜索结果存放数组
mySearchResultArray = [[NSMutableArray alloc] init];
searchController 初始化
// 声明搜索控制器,自带一个表格视图控制器,用来展示搜索结果,必须设置为全局变量
@property(nonatomic, retain)UISearchController *mySearchController; // 实例化搜索控制器
mySearchController = [[UISearchController alloc] initWithSearchResultsController:nil]; // 设置搜索代理
mySearchController.searchResultsUpdater = self; // 设置搜索条大小
[mySearchController.searchBar sizeToFit]; // 设置搜索期间背景视图是否取消操作,default is YES
mySearchController.dimsBackgroundDuringPresentation = NO; // 设置搜索期间是否隐藏导航条,default is YES
mySearchController.hidesNavigationBarDuringPresentation = NO; // 将 searchBar 添加到表格的开头
myTableView.tableHeaderView = mySearchController.searchBar;
UISearchResultsUpdating 协议方法
// 更新搜索结果
/*
只要搜索框的文字发生了改变,这个方法就会触发。searchController.searchBar.text 为搜索框内输入的内容
*/
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { // 清除上一次的搜索结果
[mySearchResultArray removeAllObjects]; // 将搜索的结果存放到数组中
for (NSArray *subArray in myDataArray) {
for (NSString *str in subArray) { NSRange range = [str rangeOfString:searchController.searchBar.text]; if (range.length) {
[mySearchResultArray addObject:str];
}
}
} // 重新加载表格视图,不加载的话将不会显示搜索结果
[myTableView reloadData];
}
UITableView 协议方法
// 设置分段头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (mySearchController.active) { return @"搜索结果";
}
return [NSString stringWithFormat:@"%c", (char)('A' + section)];
} // 设置分段数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (mySearchController.active) { return 1;
}
return myDataArray.count;
} // 设置行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (mySearchController.active) { return mySearchResultArray.count;
}
return [[myDataArray objectAtIndex:section] count];
} // 设置每段显示的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testIdentifier"]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"testIdentifier"];
} if (mySearchController.active) {
cell.textLabel.text = [mySearchResultArray objectAtIndex:indexPath.row];
}
else {
cell.textLabel.text = [[myDataArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
} return cell;
}
Swift
遵守协议 UISearchResultsUpdating
搜索结果数组初始化
// 初始化搜索结果存放数组
var searchResultArray:[String] = Array()
searchController 初始化
// 声明搜索控制器,自带一个表格视图控制器,用来展示搜索结果,必须设置为全局变量
var mySearchController:UISearchController! // 实例化搜索控制器
mySearchController = UISearchController(searchResultsController: nil) // 设置搜索代理
mySearchController.searchResultsUpdater = self // 设置搜索条大小
mySearchController.searchBar.sizeToFit() // 设置搜索期间背景视图是否取消操作,default is YES
mySearchController.dimsBackgroundDuringPresentation = false // 设置搜索期间是否隐藏导航条,default is YES
mySearchController.hidesNavigationBarDuringPresentation = false // 将 searchBar 添加到表格的开头
myTableView.tableHeaderView = mySearchController.searchBar
UISearchResultsUpdating 协议方法
// 更新搜索结果
/*
只要搜索框的文字发生了改变,这个方法就会触发。searchController.searchBar.text 为搜索框内输入的内容
*/
func updateSearchResultsForSearchController(searchController: UISearchController) { // 清除上一次的搜索结果
searchResultArray.removeAll() // 将搜索的结果存放到数组中
for subArray in myDataArray {
for str in subArray { let range:NSRange = (str as NSString).rangeOfString(searchController.searchBar.text!) if range.length != 0 {
searchResultArray.append(str)
}
}
} // 重新加载表格视图,不加载的话将不会显示搜索结果
myTableView.reloadData()
}
UITableView 协议方法
// 设置分段头标题
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { if mySearchController.active {
return "搜索结果"
}
return "\(Character(UnicodeScalar(65 + section)))"
} // 设置分段数
func numberOfSectionsInTableView(tableView: UITableView) -> Int { if mySearchController.active { return 1
}
return myDataArray.count
} // 设置行数
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if mySearchController.active { return searchResultArray.count
}
return myDataArray[section].count
} // 设置每段显示的内容
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("testIdentifier") if cell == nil {
cell = UITableViewCell(style: .Default, reuseIdentifier: "testIdentifier")
} if mySearchController.active {
cell!.textLabel?.text = searchResultArray[indexPath.row]
}
else {
cell!.textLabel?.text = myDataArray[indexPath.section][indexPath.row]
} return cell!
}
iOS - UISearchController的更多相关文章
- iOS UISearchController 的使用方法
iOS UISearchController 的使用方法 UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作.UISearchCon ...
- iOS UISearchController的使用
在iOS9中,UISearchDisplayController 已经被UISearchController替代.搜索框是一种常用的控件. 假设我们要满足下图的需求,产生100个“数字+三个随机字母” ...
- iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)
在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...
- iOS UISearchBar UISearchController
搜索栏的重要性我们就不说了,狼厂就是靠搜索起家的,现在越来越像一匹没有节操的狼,UC浏览器搜索栏现在默认自家的神马搜索,现在不管是社 交,O2O还是在线教育等都会有一个搜索栏的实现,不过彼此实现效果是 ...
- iOS中的两种搜索方式UISearchDisplayController和UISearchController
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayCon ...
- iOS中 UISearchController 搜索栏 UI技术分享
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 20px; font-family: 'STHeiti Light' ...
- iOS开发-搜索栏UISearchBar和UISearchController
iOS中UISearchDisplayController用于搜索,搜索栏的重要性我们就不说了,狼厂就是靠搜索起家的,现在越来越像一匹没有节操的狼,UC浏览器搜索栏现在默认自家的神马搜索,现在不管是社 ...
- [转] iOS开发-搜索栏UISearchBar和UISearchController
原文网址: http://www.cnblogs.com/xiaofeixiang/p/4273620.html?utm_source=tuicool iOS中UISearchDisplayContr ...
- iOS --- 搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)
在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...
随机推荐
- 测试过程中LR的关联报错
在测试过程中,录制的脚本会做一些关联.在测试的过程中,常常出现关联失败的情况. 如果最后的结果有检查点,检查点失败而事务失败. 每次出现这样的情况,我都不知道如何办.为了不出现错误,我都在关联函数里面 ...
- Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- php单链表实现的代码
<?php/*** 单链表*/ class Demo{private $id;public $name;public $next;public function __construct ($id ...
- PHP笔记随笔
1.CSS控制页面文字不能复制: body{-webkit-user-select:none;} 2.[php过滤汉字和非汉字] $sc="aaad....##--__i汉字过滤&quo ...
- Mongodb 和Redis 的相同点和不同点
MongoDB和Redis都是NoSQL,采用结构型数据存储.二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同.MongoDB建议集群部署,更多的考虑到集群 ...
- [原创]南水之源A*(A-Star)算法
开发导航之前我看了一些A*(A-Star)算法的例子和讲解.没有求得甚解!不过也从A*(A-Star)算法中得到启发,写了一套自己的A*(A-Star)算法.当然,这不是真正(我也不知道)的A*(A- ...
- Oracle绑定变量
select * from table where id = ? 类似于上面这样的sql,如果不用绑定变量,每次执行时Oracle会认为是不同的sql,会在每次执行时生成一遍执行计划,而执行计划的生成 ...
- JQuery知识快览之三—JQuery对象集
本文讲述JQuery对象集的各相关知识 获取JQuery对象集 JQuery对象,和DOM对象是两个不同的东西,JQuery对象可以是DOM对象的封装,但是JQuery对象不只是DOM对象的封装,它还 ...
- Number Sequence 分类: HDU 2015-06-19 20:54 10人阅读 评论(0) 收藏
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 二叉搜索树的后序遍历路径(《剑指offer》面试题24)
题目:输入一个整数数组,判断该数组是不是二叉搜索树的后序遍历序列的结果,如果是,则返回true,如果不是则返回false.假设输入的数组的任意两个数字都互不相同. 分析:在后序遍历得到的序列中,最后一 ...