以前一直都使用UISearchDisplayController和NSPredicate来做数据的搜素过滤,当时今天在使用UISearchDisplayController这个控件的时候发现它被苹果用一条明显的红线给划掉了,这说明苹果已经不再推荐使用了。查了下文档发现在IOS8中苹果已经使用新的UISearchController来替代了。下面跟大家分享下UISearchController的使用!直接上代码:
#import "ViewController.h"
/**
* 实现必要的协议
*/
@interface ViewController ()<UISearchResultsUpdating,UITableViewDataSource>
{
NSArray *listArr;
NSArray *resultArr;
UISearchController *searchCT;
}
@end
@implementation ViewController
/**
* IOS8更新之后原来的搜索组件"UISearchDisplayController"已经被注销了,注销的原因是这个类有局限性,只能将搜索结果显示在UITableView上。
在IOS8下取代UISearchDisplayController的是UISearchController!
*/
- (void)viewDidLoad {
[super viewDidLoad];
//实例化数组数据
listArr=[NSArray arrayWithObjects:@"iphone",@"ipod",@"ipad",@"appleTV",@"macMini",@"macPro",@"macAir",@"iMac", nil];
resultArr=[NSArray new];
//实例化这个搜索对象,最后一个参数nil表示将搜索的结果显示在当前的视图中
searchCT=[[UISearchController alloc]initWithSearchResultsController:nil];
//设置一个controller负责响应searchController的更新
searchCT.searchResultsUpdater=self;
self.tableView.dataSource=self;
searchCT.dimsBackgroundDuringPresentation=NO;
CGRect searchRect=searchCT.searchBar.frame;
searchRect.size.height=44;
searchCT.searchBar.frame=searchRect;
//添加到父视图的顶部
self.tableView.tableHeaderView=searchCT.searchBar;
//搜索的结果可以覆盖当前的页面
self.definesPresentationContext=YES;
// Do any additional setup after loading the view, typically from a nib.
}
/**
* tableView的数据源方法
*/
-(NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (resultArr!=nil) {
//显示的是搜索出来的数据
return resultArr.count;
}else{
//显示的默认的数据
return listArr.count;
}
}
-(NSInteger )numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
static NSString *identifier=@"myCell";
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell;
cell=[tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
if (cell == nil) {
//自己创建
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
}
//设置cell的属性
if (resultArr !=nil) {
cell.textLabel.text=[resultArr objectAtIndex:indexPath.row];
}else{
cell.textLabel.text=[listArr objectAtIndex:indexPath.row];
}
return cell;
}
/**
* searchController的代理方法
*/
-(void )updateSearchResultsForSearchController:(UISearchController *)searchController{
if (searchCT.isActive) {
//如果搜索控件可用,取到搜索条里面的文本内容
NSString *myResult=searchCT.searchBar.text;
if (myResult.length>0) {
//如果文本的内容不为空,使用谓词进行过滤
NSPredicate *predict=[NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@",myResult];
resultArr=[listArr filteredArrayUsingPredicate:predict];
}else{
//搜索结果为空
resultArr=nil;
}
}else{
//如果搜索控件为非活动状态
resultArr=nil;
}
//刷新tableView界面
[self.tableView reloadData];
}