在页面数据很多的时候我们通常会被要求加一个本地的搜索功能,苹果给我们提供了一个封装的很好的控件UISearchController,下边介绍一下他的简单使用
定义需要的全局变量并初始化
@interface SearchControllerViewController ()<UITableViewDelegate,UITableViewDataSource,UISearchResultsUpdating,UISearchControllerDelegate>
@property (strong, nonatomic) NSArray *dataArr;
@property (strong, nonatomic) NSMutableArray *resultArrM;
@property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) UISearchController *searchController;
@property (strong, nonatomic) ResultViewController *resultVC;
@end
- (void)viewDidLoad {
[super viewDidLoad]
[self configureUI]
}
- (void)configureUI{
self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, self.view.frame.size.height) style:UITableViewStylePlain]
self.tableView.delegate = self
self.tableView.dataSource = self
[self.view addSubview:self.tableView]
self.searchController.searchBar.frame = CGRectMake(0, 0, ScreenWidth, 44)
self.tableView.tableHeaderView = self.searchController.searchBar
}
下边是UISearchController的初始化及参数配置
- (UISearchController *)searchController{
if (!_searchController) {
_searchController = [[UISearchController alloc]initWithSearchResultsController:self.resultVC];
_searchController.searchResultsUpdater = self;
_searchController.delegate = self;
self.definesPresentationContext = YES;
_searchController.dimsBackgroundDuringPresentation = YES;
_searchController.hidesNavigationBarDuringPresentation = YES;
}
return _searchController;
}
在searchResultsUpdater中写数据的搜索逻辑,采用谓词的方法对全部的数据进行筛选,得到结果之后进行展示
// 开始进行搜索
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{
[self.resultArrM removeAllObjects]
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",searchController.searchBar.text]
self.resultArrM = [NSMutableArray arrayWithArray:[self.dataArr filteredArrayUsingPredicate:predicate]]
// 将关键词传入结果控制器可以在展示的时候通过富文本将关键词变成特别的样式
self.resultVC.keyWord = searchController.searchBar.text
self.resultVC.resultArr = self.resultArrM.copy
// 如果展示在当前控制器则刷新界面
// [self.tableView reloadData]
}
下边是UISearchControllerDelegate的一些方法供参考
- (void)willPresentSearchController:(UISearchController *)searchController{
NSLog(@"SearchController即将present");
}
- (void)didPresentSearchController:(UISearchController *)searchController{
NSLog(@"SearchController已经present完成");
}
- (void)willDismissSearchController:(UISearchController *)searchController{
NSLog(@"SearchController即将Dismiss");
}
- (void)didDismissSearchController:(UISearchController *)searchController{
NSLog(@"SearchController已经Dismiss完成");
}
最后对搜索结果进行展示
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"UITableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
cell.textLabel.text = self.dataArr[indexPath.row];
return cell;
}
如果将搜索界面传递到其他控制器,就在其他的控制器中对数据进行逻辑处理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)