UISearchController

UISearchController浅析-中篇

2016-08-25  本文已影响1115人  杭研融合通信iOS

上篇对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不再需要主视图控制器去显示搜索结果,具体原因将在下一篇文章中具体解释。

上一篇下一篇

猜你喜欢

热点阅读