UISearchController浅析-上篇

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,敬请期待!

你可能感兴趣的:(UISearchController浅析-上篇)