UISearchBar和UISearchDispalyController的详细使用

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

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

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

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

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (searchText != nil && searchText.length > 0)
    {
        self.marr = [NSMutableArray array];//这里可以说是清空tableview旧datasouce
        for (NSString *str in _arr) {
            if ([str rangeOfString:searchText options:NSCaseInsensitiveSearch].length > 0)//这里进行数据查询
            {
                [_marr addObject:str];   
            }
        }
        [_tbl_city reloadData];//重新加载tableview
    }else{
        self.marr = [NSMutableArray arrayWithArray:_arr];
        [_tbl_city reloadData];
    }
}

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。

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    /// 筛选数据
    if (searchString != nil && searchString.length > 0)
    {
        self.marr = [NSMutableArray array];
        for (NSString *str in _arr) {
            if ([str rangeOfString:searchString options:NSCaseInsensitiveSearch].length > 0)
            {
                [_marr addObject:str];
            }
        }
    }
    else
        self.marr = [NSMutableArray arrayWithArray:_arr];
    return YES;
}
下面说一下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不用我们通过代码去实现。当你点击UISearchDisplayControllerUISearchBar输入框时,系统会自行帮你show。点击取消按钮,系统会帮你hide

使用UISearchDisplayController当键盘弹出来的时候,会默认把navagationBar给隐藏起来。如果不需要隐藏navagationBar,最好的处理方式就是重写UISearchDisplayController-(void)setActive:(BOOL)visible animated:(BOOL)animated方法:自定义一个类CustomSearchDisplayController,继承自UISearchDisplayController,然后在.m文件中重写该方法,并在该方法中主动显示navagationBar

@implementation CustomDisplaySearchViewController
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NOanimated:NO];
}
@end

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

- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView
{
    for (UIView *subview in tableView.subviews) {
        if ([subview isKindOfClass:[UILabel class]]) {
            [(UILabel *)subview setText:@"无结果"];
        }
    }
}
不过这个地方存在一个问题,我当时把遍历写到 shouldReloadTableForSearchString中时,第一次NO Result标签不会改变,当再一次执行到shouldReloadTableForSearchString时,才会显示你的无结果标签。但是这个方法明明执行在will和didshow方法之前。希望高人指点。
UISearchDisplayController UISearchBar 输入框当无输入时, SearchResultsTableView 无法根据个人需求让表展示出来。我尝试过通过点击搜索栏 delegate 方法中去处理表展示问题,可是尝试失败了。
本人是想根据个人需求让resultsTableView展示出来的,可是没成功,希望大神看到后能指点一下。比如点击searchBarResultsListButton后显示。







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值