上篇对UISearchBar+UISearchDisplayController做了简单概述,本篇将介绍故事的主人公-UISearchController。
1.UISearchController概述
官方对UISearchController的定义如下:
A UISearchController object manages the display of search results based on interactions with a search bar. You use a search controller in tandem with your existing view controllers. When you have a view controller with searchable content, incorporate the search bar of a UISearchController object into your view controller’s interface. When the user interacts with that search bar, the search controller automatically displays a new view controller with the search results that you specify.
UISearchController是一个视图控制器,本身已经自带了一个UISearchBar,可以设置一个自定义的ViewController来显示搜索结果。可以说整一个搜索流程可以通过UISearchController单独完成,不需要依赖原视图控制器。
2.UISearchController使用
官方对UISearchController的使用方法也有详细的说明,同样也结合Demo讲讲我的思路。
第一步:自定义显示搜索结果的ViewController,通常搜索结果会以列表的方式展示,所以一般使用UITableViewController作为基类,或者用UIViewController作为基类,里面自定义UITableView也是可以的。本例选择自定义SearchResultTableVC类,继承自UITableViewController:
SearchResultTableVC *_searchResultTableVC;
第二步:在主视图控制器初始化UISearchController和SearchResultTableVC:
_searchResultTableVC= [[SearchResultTableVC alloc] init];
_searchResultTableVC.delegate=self;
_searchController= [[UISearchController alloc] initWithSearchResultsController:_searchResultTableVC];
_searchController.searchResultsUpdater=_searchResultTableVC;
(1)SearchResultTableVC定义了一个delegate,用来定义点击搜索结果后的回调;
(2)self指的是主视图控制器,具体实现SearchResultTableVC中的回调方法;
(3)声明_searchResultTableVC成为_searchController监听输入内容的代理。
第三步:在SearchResultTableVC中(非主视图控制器)实现UISearchResultsUpdating和搜索逻辑
#pragma mark - UISearchResultsUpdating
- (void)updateSearchResultsForSearchController:(UISearchController*)searchController
{
// 实现搜索逻辑代码
}
第四步:在SearchResultTableVC中(非主视图控制器)展示搜索结果:
//搜索结果数组
NSMutableArray*_searchResultArray;
实现上一步的搜索逻辑后,本例将结果保存到_searchResultArray。
// 搜索完成后可别忘记刷新tableview
[self.tableview reloadData];
#pragma mark - UITableViewDataSource,UITableViewDelegate
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return _searchResultArray.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// 根据自己的需要去展示cell
return cell;
}
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
[tableViewdeselectRowAtIndexPath:indexPathanimated:YES];
[_searchDisplayControllersetActive:NO];
// 实现选择某个结果后的逻辑代码
}
显示结果的方式与上篇UISearchDisplayController如出一撤,只是使用UISearchController不再需要主视图控制器去显示搜索结果,具体原因将在下一篇文章中具体解释。
网友评论