iOS8.0之前,搜索栏基本都是靠UISearchBar+UISearchDisplayController这对好基友来实现的。iOS8.0之后,苹果总算成全了它们,UISearchController便由此诞生。喜新厌旧一直以来都是苹果大大们的风格,UISearchController的出现宣告着UISearchDisplayController的遗弃,只留下了"UISearchDisplayController has been replaced with UISearchController"这么一句话。
那么,UISearchController作为继承UISearchBar+UISearchDisplayController意志的类,为何能青出于蓝而胜于蓝?而我们作为“社会主义的加班人”,又该如何更好地取其精华,去其糟粕?鄙人不才,因为项目需求接触了一段时间,可以说是尝到过甜头,也掉进过大坑,借此机会跟大家分享一下学(tian)习(keng)心得,如有不足之处,往各位看官多多谅解,多多指点。
1.UISearchBar+UISearchDisplayController概述
官方对UISearchBar的定义如下:
The UISearchBar class implements a text field control for text-based searches. The control provides a text field for entering text, a search button, a bookmark button, and a cancel button. The UISearchBar object does not actually perform any searches. You use a delegate, an object conforming to the UISearchBarDelegate protocol, to implement the actions when text is entered and buttons are clicked.
简单来说,UISearchBar继承自UIView,是一个能够实现文字搜索的文本输入框。然而已经找不到UISearchDisplayController的官方介绍了,只找到了下面一段话:
Important:UISearchDisplayController is deprecated in iOS 8. (Note that UISearchDisplayDelegate is also deprecated.) To manage the presentation of a search bar and display search results in iOS 8 and later, instead useUISearchController.
苹果并没有宣布UISearchBar也一并废弃,但是UISearchController本身已经有了一个UISearchBar,足够满足绝大多数的需求(剩下的那一小部分,如果有的话应该是UISearchBar的定制化)。因此一旦你投入了UISearchController的怀抱,就请忘掉这两个类吧。
2.UISearchBar+UISearchDisplayController使用
官方对这两个类的使用方法有详细的说明(UISearchBar和UISearchDisplayController),这里结合我做的Demo讲讲我的思路。
第一步:初始化UISearchBar和UISearchDisplayController
UISearchDisplayController *_searchDisplayController;
UISearchBar *_searchBar;
_searchBar= [[UISearchBar alloc] initWithFrame:CGRectMake(0,0,SCREEN_WIDTH,44)];
_searchDisplayController= [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
_searchDisplayController.delegate=self;
_searchDisplayController.searchResultsDelegate=self;
_searchDisplayController.searchResultsDataSource=self;
[self.view addSubview:_searchBar];
(1)_searchBar需要初始化Frame,这里的SCREEN_WIDTH是屏幕的宽度;
(2)_searchDisplayController初始化需要传入两个值,一个是搜索框UISearchBar,另一个是用来展示搜索内容的UIViewController;
(4)需要设置UISearchDisplayController的代理,delegate负责监听并处理_searchBar中的文字变化,searchResultsDelegate和searchResultsDataSource负责展示并处理搜索内容,熟悉UITableViewController的开发者肯定对这两个delegate不陌生。
(4)本例中的self是一个UIViewController,整个界面也不全是tableview。如果使用UITableViewController的话,通常用self.tableView.tableHeaderView = _searchBar来放置_searchBar的位置。效果相同,都是放在顶部。
第二步:实现UISearchDisplayDelegate和搜索逻辑
#pragma mark - UISearchDisplayDelegate
- (BOOL)searchDisplayController:(UISearchDisplayController*)controller shouldReloadTableForSearchString:(NSString*)searchString
{
// 实现搜索逻辑代码
returnYES;
}
searchString就是在_searchBar输入的文本内容,如果将实现搜索逻辑的代码放在这个函数里,那么表示实现的搜索方式是实时搜索,即边输入边搜索。如果想通过其他的事件(例如点击键盘的确认按钮)开始搜索逻辑,那么需要实现其他的delegate,笔者没有用过其他方法,就不在这里班门弄斧了。实时搜索的优势在于给用户的反馈效果好,劣势在于消耗的资源大。
第三步:既然已经得到搜索结果,那么现在将它们展示出来吧
NSMutableArray *_searchResultArray;
实现上一步的搜索逻辑后,本例将结果保存到_searchResultArray。
// 搜索完成后可别忘记刷新tableview
[_searchDisplayController.searchResultsTableView 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
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[_searchDisplayController setActive:NO];
// 实现选择某个结果后的逻辑代码
}
相信聪明的开发者们已经不需要笔者再解释这三个方法的用途,所以这里就一笔带过了,跟实现UITableViewController的方式如出一辙。
3.总结
本篇简单介绍了UISearchBar+UISearchDisplayController的概念和使用方法,回顾了下感觉没有什么干货,各位看官老爷们将就将就吧。下一篇必然会出现主人公UISearchController,敬请期待!