UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类。
里面内置了一个 UITableView 用于显示搜索的结果。它可以和一个需要搜索功能的
controller 关联起来,其它的像原 TableView 和搜索结果 TableView 的切换, mask 的显示等等都
封装好了,使用起来非常非常的简单。特别是要实现全屏搜索时使用最多。
全屏搜索的意思是如果你用了 NavigationBar 当点击搜索框时 TableView 会自动弹上去覆盖
NavigationBar,达到一种全屏搜索的效果,这一切 UISearchDisplayController 都封装好了,如果自己
写就比较麻烦一些。
#import "SearchListViewController.h" @interface SearchListViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchResultsUpdating,UISearchBarDelegate,UISearchDisplayDelegate> { NSArray *_dataList; NSMutableArray *_showData; UISearchBar *_searchBar; UITableView *_searchTableView; UISearchDisplayController *searchDisplayController; } @end @implementation SearchListViewController - (void)viewDidLoad { [super viewDidLoad]; [self setTopNavBackButton]; [self initContentView]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:YES]; [self performSelector:@selector(setCorrectFocus) withObject:NULL]; } - (void)initContentView { _showData = [[NSMutableArray alloc]init]; _dataList = [@[@"百度",@"杭州",@"谷歌",@"苹果",@"and",@"广州",@"view",@"and",@"and",@"苹果IOS",@"谷歌android",@"微软",@"微软WP",@"table",@"bable",@"sable",@"安庆",@"西湖",@"六六",@"gable",@"fable",@"mable"]mutableCopy]; [self initSearchBar]; } #pragma mark -- UI - (void)initSearchBar { _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 20, kDEVICEWIDTH,44)]; _searchBar.placeholder = @"搜索"; [self.view addSubview:_searchBar]; searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self]; searchDisplayController.searchResultsDataSource = self; searchDisplayController.searchResultsDelegate = self; _searchBar.delegate = self; } - (void)initTableView { _searchTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, kDEVICEWIDTH, kDEVICEHEIGHT-20) style:UITableViewStylePlain]; _searchTableView.delegate = self; _searchTableView.dataSource = self; [self.view addSubview:_searchTableView]; } - (void)setCorrectFocus { [_searchBar becomeFirstResponder]; } /* * 如果原 TableView 和 SearchDisplayController 中的 TableView 的 delete 指向同一个对象 * 需要在回调中区分出当前是哪个 TableView */ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 谓词搜索 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains [cd] %@",searchDisplayController.searchBar.text]; _showData = [[NSMutableArray alloc] initWithArray:[_dataList filteredArrayUsingPredicate:predicate]]; return _showData.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellId = @"mycell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; } cell.textLabel.text = _showData[indexPath.row]; return cell; } -(void) searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self searchBar:_searchBar textDidChange:nil]; [_searchBar resignFirstResponder]; } - (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar { [self searchBar:_searchBar textDidChange:nil]; [_searchBar resignFirstResponder]; } @end