当前位置: 代码迷 >> Iphone >> UITableView的搜寻:SearchBar和SearchDisplayController;UISearchController
  详细解决方案

UITableView的搜寻:SearchBar和SearchDisplayController;UISearchController

热度:137   发布时间:2016-04-25 05:31:24.0
UITableView的搜索:SearchBar和SearchDisplayController;UISearchController

之前我写过一篇关于在tableView中利用谓词搜索的随笔,当时使用的是自定义textField,最近在写电子书,需要在书目时实现搜索功能.所以在此把以前用于实现搜索功能系统提供的的SearchBar和SearchDisplayController的方法在这里和大家分享一下.不过在iOS8滞后,苹果已经不再推荐我们是使用这两个旧东西,而是让我们使用UISearchController,自然我也会把这个新东西的用法在这里演示一下.

 

SearchBar和SearchDisplayController
先在视图xib文件中添加tableView,在表上面添加SearchBar和SearchDisplayController.如图:

 

需要用到的协议有:<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchDisplayDelegate>

我在这里声明了两个数据,用来保存搜索数据和搜索结果:

@property(nonatomic,retain)NSMutableArray *dataArray;
@property(nonatomic,retain)NSMutableArray *resultArray;

初始化数组:
self.dataArray=[[NSMutableArray alloc]initWithObjects:@"张三",@"李四",@"王五",@"阿五",@"云飞",@"asd", nil];

 

在这里其实有两个表,一个是搜索前的所有数据,另一个是展示搜索结果,所以在写tabbleView的协议时需要进行区分:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    if (tableView==self.tableView) {        return self.dataArray.count;    }    else    {        return self.resultArray.count;    }}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *str=@"cell";    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:str];    if (cell==nil) {        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];    }    if (tableView==self.tableView) {        cell.textLabel.text=self.dataArray[indexPath.row];    }    else    {        cell.textLabel.text=self.resultArray[indexPath.row];    }    return cell;}

 

接着是UISearchBarDelegate,UISearchDisplayDelegate的协议方法

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{    NSLog(@"搜索开始");    return YES;}-(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar{    NSLog(@"搜索结束");    return YES;}-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{    NSPredicate *preicate=[NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",searchString];    if (self.resultArray!=nil) {        [self.resultArray removeAllObjects];    }    self.resultArray=[NSMutableArray arrayWithArray:[self.dataArray filteredArrayUsingPredicate:preicate]];    NSLog(@"%lu",(unsigned long)self.resultArray.count);    return YES;}

 

在这里我们用来区分的关键代码还是谓词,相对于正则表达式,谓词已经是很简单了.不过我还是记不住

运行结果如下:

 

虽然这个很好用,但是苹果公司在iOS8的时候已经讲他打上了红杠,推荐我们使用的是UISearchController

首先需要添加的协议有<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchResultsUpdating>

还是现在xib文件中拖入一个tabView,为了不相互影响,我将两个放在不同的视图里

同样声明两个数组,功能同上;还有一个UIsearchController(因为我不知道拖的话是哪个控件,所以只好手写):

@property(nonatomic,retain)UISearchController *seachController;
@property(nonatomic,retain)NSMutableArray *resultArray;
@property(nonatomic,retain)NSMutableArray *dataArray;

 

初始化数组并手动创建searchController:

self.dataArray=[[NSMutableArray alloc]initWithObjects:@"张三",@"李四",@"王五",@"阿五",@"云飞",@"asd", nil];        self.seachController=[[UISearchController alloc]initWithSearchResultsController:nil];    self.seachController.searchResultsUpdater=self;    self.seachController.dimsBackgroundDuringPresentation=NO;    self.seachController.hidesNavigationBarDuringPresentation=NO;    self.seachController.searchBar.frame=CGRectMake(self.seachController.searchBar.frame.origin.x, self.seachController.searchBar.frame.origin.y, self.seachController.searchBar.frame.size.width, 44.0);    self.tableView.tableHeaderView=self.seachController.searchBar;

 

同样道理,这里也是有两个搜索结果,所以需要判断:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    if (!self.seachController.active) {        return self.dataArray.count;    }    else    {        return self.resultArray.count;    }}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *str=@"cell";    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:str];    if (cell==nil) {        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];    }    if (!self.seachController.active) {        cell.textLabel.text=self.dataArray[indexPath.row];    }    else    {        cell.textLabel.text=self.resultArray[indexPath.row];    }    return cell;}

 

协议方法,在这里我们用的还是谓词判断

-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{    NSString *searchString=self.seachController.searchBar.text;    NSPredicate *preicate=[NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",searchString];    if (self.resultArray!=nil) {        [self.resultArray removeAllObjects];    }    self.resultArray=[NSMutableArray arrayWithArray:[self.dataArray filteredArrayUsingPredicate:preicate]];    NSLog(@"%lu",(unsigned long)self.resultArray.count);    [self.tableView reloadData];}

 

结果演示:

 

我写的随笔大部分是有源码的,如果有想要的,可以联系我.我的个人资料里有我的QQ.