你的位置:首页 > 操作系统

[操作系统]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.