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];
}
效果演示:
不过两者最终实现的效果的效果基本上是一致,殊途同归,本文难免有所遗漏,如有不当,请多多指正~