iOS開発-検索バーUISearchBarおよびUISearchController

iOS開発-検索バーUISearchBarおよびUISearchController

検索バーの重要性については話さないでください。オオカミの工場は検索から始まりました。今では道徳のないオオカミのように見えます。UCブラウザの検索バーはデフォルトで独自の魔法の検索になります。ソーシャルかソーシャルかO2Oやオンライン教育などでは検索バーが実装されますが、実装効果は異なります。iOSの検索バーの実装は比較的簡単です。インターネット上にも多くの参考資料がありますが、信頼できるものは多くありません。それらの多くはiOS8.0より前に実装されています。iOS8.0での実装はめったに見られないようです。Iいくつかの外国人のコードを読んでください。、UISearchControllerを使用した後はとても気分がいいです。

UISearchBarおよびUIDisplayController

これはインターネット上で最も一般的で最も単純です。SearhBarSearchDisplayControllerを使用するコントロールもあります。この記事では、検索バーとUITableViewを使用してデモを検索します。上部が検索バーで、前がTableViewです。 :

検索を実現するには、デリゲートUISearchBarDelegate、UISearchDisplayDelegateを宣言する必要があり、検索では主にUISearchDisplayDelegateを使用します。特定のコード実装プロセス:

フィールドを宣言する:

@property(strong、nonatomic)NSMutableArray   * dataList ; @property(strong、nonatomic)NSMutableArray   * searchList ;

初期化データ:

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

セットエリア:

//領域を設定
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1 ; 
}
     

エリア内の行数を設定します(強調)。これは、デリゲートを使用した後、検索後にビューを使用する必要があるかどうかを判断するためのものです。

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

同じ返されたセルには2つの状況があります。1つは初期化されたデータで、もう1つはフィルター処理されたデータビューです。

-(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-ドイツ語の開始イベントと終了イベント:

- (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];
}

效果演示:

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

おすすめ

転載: blog.csdn.net/woruosuifenglang/article/details/51724174