iOS development-search bar UISearchBar and UISearchController

iOS development-search bar UISearchBar and UISearchController

Let’s not talk about the importance of the search bar. The wolf factory started by searching. Now it looks more and more like a wolf without morals. The search bar of UC browser now defaults to its own magical search. Now whether it is social or O2O Or online education, etc. will have a search bar implementation, but the implementation effects are different from each other. The search bar in iOS is relatively simple to implement. There are also many reference materials on the Internet, but there are not many reliable ones. Many of them are implemented before iOS 8.0. The implementation on iOS 8.0 seems to be rarely seen. I read some foreigners' codes. , I feel very good after using UISearchController.

UISearchBar and UIDisplayController

It is the most common and the simplest on the Internet. There are also controls that use Searh Bar Search Display Controller. This article simply uses Search Bar and UITableView to search for Demo. The top is the search bar, and the previous one is TableView:

In order to realize the search, it is necessary to declare the delegate UISearchBarDelegate, UISearchDisplayDelegate, and the search mainly uses UISearchDisplayDelegate. The specific code implementation process:

Declare fields:

@property (strong,nonatomic) NSMutableArray  *dataList;

@property (strong,nonatomic) NSMutableArray  *searchList;

Initialization data:

self.dataList=[NSMutableArray arrayWithCapacity:100];
    
    for (NSInteger i=0; i<100; i++) {
        [self.dataList addObject:[NSString stringWithFormat:@"%ld-FlyElephant",(long)i]];
    }

Set area:

//Set 
area-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1 ; 
}
     

Set the number of rows in the area (emphasis). This is to determine whether you need to use the view after Search after using the delegate:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        if (tableView == self.searchDisplayController.searchResultsTableView) {
            return [self.searchList count];
        }else{
            return [self.dataList count];
    }
}

There are also two situations for the same returned cell, one is the initialized data, the other is the filtered data view:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString *flag=@"cellFlag";
  UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag];
  if (cell==nil) {
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag];
  }
  if (tableView==self.searchDisplayController.searchResultsTableView) {
    [cell.textLabel setText:self.searchList[indexPath.row]];
  }
  else{
    [cell.textLabel setText:self.dataList[indexPath.row]];
  }
  return cell;
}

UISearchBarDelegate Sino-German start and end events:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{
  NSLog(@"搜索Begin");
  return YES;
}
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar{
  NSLog(@"搜索End");
  return YES;
}

搜索时过滤数据:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
  // 谓词的包含语法,之前文章介绍过http://www.cnblogs.com/xiaofeixiang/
  NSPredicate *preicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString];
  if (self.searchList!= nil) {
    [self.searchList removeAllObjects];
  }
  //过滤数据
  self.searchList= [NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]];
  //刷新表格
  return YES;
}

最终效果如下:

UISearchController实现搜索

UISeachBar通过UISearchDisplayDelegate实现上面的效果是没有问题的,网上也有很多类似的实现效果,不过是警告的,信息如下: 'searchDisplayController' is deprecated: first deprecated in iOS 8.0,这么明显一个警告总不能视而不见吧 , 在StackOverFlow 中发现 UISearchDisplayController is deprecated in IOS8 .0 , and recommended to use UISearchController instead ,也就是说 iOS 8.0 不推荐UISearchDisplayController, 也就是不推荐使用 UISearchDisplayDelegate ,但是可以通过 UISearchController 实现 UISearchResultsUpdating 这个委托实现上面的效果;

视图中中需要声明UISearchResultsUpdating:

@interface ViewController : UITableViewController<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchResultsUpdating>


@end

属性声明:

@property (nonatomic, strong) UISearchController *searchController;

需要自己初始化一下UISearchController:

_searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
  _searchController.searchResultsUpdater = self;
  _searchController.dimsBackgroundDuringPresentation = NO;
  _searchController.hidesNavigationBarDuringPresentation = NO;
  _searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
  self.tableView.tableHeaderView = self.searchController.searchBar;

之前是通过判断搜索时候的TableView,不过现在直接使用self.searchController.active进行判断即可,也就是UISearchController的active属性:

//设置区域的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
      if (self.searchController.active) {
        return [self.searchList count];
      }else{
        return [self.dataList count];
      }
}
//返回单元格内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString *flag=@"cellFlag";
  UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:flag];
  if (cell==nil) {
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flag];
  }
  if (self.searchController.active) {
    [cell.textLabel setText:self.searchList[indexPath.row]];
  }
  else{
    [cell.textLabel setText:self.dataList[indexPath.row]];
  }
  return cell;
}

具体调用的时候使用的方法也发生了改变,这个时候使用updateSearchResultsForSearchController进行结果过滤:

-(void)updateSearchResultsForSearchController:(UISearchController *)searchController {
  NSString *searchString = [self.searchController.searchBar text];
  NSPredicate *preicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString];
  if (self.searchList!= nil) {
    [self.searchList removeAllObjects];
  }
  //过滤数据
  self.searchList= [NSMutableArray arrayWithArray:[_dataList filteredArrayUsingPredicate:preicate]];
  //刷新表格
  [self.tableView reloadData];
}

效果演示:

不过两者最终实现的效果的效果基本上是一致,殊途同归,本文难免有所遗漏,如有不当,请多多指正~

Guess you like

Origin blog.csdn.net/woruosuifenglang/article/details/51724174