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使用

官方对这两个类的使用方法有详细的说明(UISearchBarUISearchDisplayController),这里结合我做的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,敬请期待!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 9,003评论 3 38
  • 1、searchBar 本例子实现布局:上面是一个navigationController,接下来一个search...
    lilinjianshu阅读 3,413评论 1 8
  • 作者唯一QQ:228544117。。。。。 =========后面的都要新建一个文章 AppDelegate.h ...
    CC_iOS阅读 823评论 0 0
  • 哦吼吼,又研究了几天,把FMDB这个封装好的数据库搞定了,写了个简单的例子,基于FMDB的添删改查操作,界面很一般...
    lichengjin阅读 518评论 0 0
  • 著名的Java单元测试框架Junit 4已经出来很长时间了,当时我发现JUnit 5已经处于测试版,就准备写文章来...
    乐百川阅读 8,244评论 0 17