您的位置:首页 > 产品设计 > UI/UE

UISearchBar和UISearchDispalyController的详细使用

2013-07-22 18:30 423 查看
最近在使用UISearchBar和UISearchDisplayController控件的时候,遇到了一些问题,但是在网络查找答案的过程中,发现网络上对于这两个空间的详细使用还没太全的资料,所以我对于自己这段时间解决的问题对这两个控件做一下详细解读。

先详细介绍一下这两个控件

一 、UISearchBar是一个继承于UIView的控件,既然是个view,它自身就会(也)包含了很多视图样式设置的方法,比如searchbar背景、scopeBar背景和searchbar上文字的设置。

searchbar实现搜索的原理是通过自身的delegate完成数据的查询并对相应的tableview进行reload操作。代码如下。

textDidChange方法(一下都对方法进行这样可识别的简写)是在每次在搜索框中输入数据的时候运行的。

searchbar自身带有4个按钮,这些按钮默认状态都是隐藏的。它们分别是 1.searchResultsButton 2.BookmarksButton 3.CancelButton 4.ScopeBar(它包含scopebarbutton)

searchBarSearchButtonClicked方法是对键盘上search键的点击事件,在这个方法中我们可以根据功能需求来完成一些操作,我在此对键盘进行了消失操作。
searchBarBookmarkButtonClicked方法是BookmarksButton的点击事件。
searchBarCancelButtonClicked方法是CancelButton的点击事件,一般取消按钮的方法中是对放弃搜索的逻辑操作,比如tableview的datasource恢复。
searchBarResultsListButtonClicked方法是searchResultsButton的点击事件。

selectedScopeButtonIndexDidChange:(NSInteger)selectedScope是scopebarbutton的点击事件。
通过delegate方法名字就能看出他们所代表意思,我们可以根据自己的业务需求来进行一些相关操作和数据处理。
二、UISearchDiplayController是一个继承于NSObject的控件,它本身包含UISearchBar,UITableView两个控件。它自身带的tableview我们为了与我们自己建的区别开来,俗称它为resultTableview。虽然这两个tableview不是同一个tableview,但是他们的delegate的内容和样式都与我们自己的tableview是相同的。
其中最重要的delegate就是一下所示的,搜索方法了,这个方法返回的是bool类型,无需开发者自己reload tableview,系统会自动加载tableview。

下面说一下delegate的其他方法。

- (void) searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller;
这是点击searchbar将要进行搜索时发生的方法,可以再次对cancelbutton样式进行更改。1

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller;
这是点击searchbar已经进行搜索时发生的方法。2

- (void)searchDisplayController:(UISearchDisplayController
*)controller didLoadSearchResultsTableView:(UITableView *)tableView;

这是在所搜框中第一次输入数据时发生的方法,是resulttableview的加载方法。3
- (BOOL)searchDisplayController:(UISearchDisplayController
*)controller shouldReloadTableForSearchString:(NSString *)searchString;

这是在所搜框中每次输入数据时发生的方法,可以说是对resulttableview进行reload的方法。4
-
(BOOL)searchDisplayController:(UISearchDisplayController
*)controller shouldReloadTableForSearchScope:(NSInteger)searchOption;

这是点击scopebutton后出发的方法,方法返回YES后会对resulttableview进行reload的方法。4

- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView;

这是resulttableview将要show的方法,每次在所搜框中输入数据时发生的方法。5

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView;
这是resulttableview已经show的方法,每次在所搜框中输入数据时发生的方法。6

- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView;

这是resulttableview将要hiden的方法,点击取消按钮或者把搜索框中数据全部删除时发生。7

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView;
这是resulttableview已经hiden的方法,点击取消按钮或者把搜索框中数据全部删除时发生。8

- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller;
这是在点击取消按钮之后将要发生的方法。9
- (void)searchDisplayController:(UISearchDisplayController
*)controller willUnloadSearchResultsTableView:(UITableView *)tableView;

这是在点击取消按钮之后,发生的resultstableview卸载方法。10
- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller;
这是在点击取消按钮之后发生的方法。11
以上方法,后边的数字标号是我测试他们发生的先后顺序之后标注的,数字代表他们发生的先后顺序。如果在endsearch的时候resultstableview还没有hiden,这是将先发生willendsearch然后发生willhide和didhide,之后发生didend。
UISearchDisplayController的取消按钮show/hide不用我们通过代码去实现。当你点击UISearchDisplayController中UISearchBar输入框时,系统会自行帮你show。点击取消按钮,系统会帮你hide。
使用UISearchDisplayController当键盘弹出来的时候,会默认把navagationBar给隐藏起来。如果不需要隐藏navagationBar,最好的处理方式就是重写UISearchDisplayController的-(void)setActive:(BOOL)visible
animated:(BOOL)animated方法:自定义一个类CustomSearchDisplayController,继承自UISearchDisplayController,然后在.m文件中重写该方法,并在该方法中主动显示navagationBar。

(UISearchDisplayController的tableView有一个标签,当没有匹配的结果时,默认会在tableView上显示一个“No
Result”的标签。如果说想自定义这个标签,可以通过循环遍历出tableView上标签。我将方法写在willShowSearchResultsTableView方法中了。

不过这个地方存在一个问题,我当时把遍历写到shouldReloadTableForSearchString中时,第一次NO Result标签不会改变,当再一次执行到shouldReloadTableForSearchString时,才会显示你的无结果标签。但是这个方法明明执行在will和didshow方法之前。希望高人指点。
UISearchDisplayController的UISearchBar输入框当无输入时,SearchResultsTableView无法根据个人需求让表展示出来。我尝试过通过点击搜索栏delegate方法中去处理表展示问题,可是尝试失败了。
本人是想根据个人需求让resultsTableView展示出来的,可是没成功,希望大神看到后能指点一下。比如点击searchBarResultsListButton后显示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: