iOS搜索功能的几种实现方式

本文详细介绍了iOS开发中常用的几种搜索组件:UISearchBar、UISearchDisplayController及UISearchController的使用方法,包括创建实例、设置样式、自定义显示逻辑等方面的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、UISearchBar
        UISearchBar相对于后面的UISearchDisplayController和UISearchController更底层。后面两种搜索方式的实现都是建立在其基础之上。采用该类实现搜索可以不用担心点击输入搜索内容时视图自带往上移动的问题,并且可以随意设置搜索框的位置。

a、创建示例:

UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(70, 9, DEVICE_WIDTH-140, 28)];
    searchBar.placeholder = @"请输入搜索内容";
    searchBar.barStyle = UISearchBarStyleMinimal;
    searchBar.delegate = self;
    UITextField *searchField1 = [searchBar valueForKey:@"_searchField"];
    searchField1.backgroundColor = [UIColor whiteColor];
    searchBar.tintColor = [UIColor blackColor];
    [self.navigationController.navigationBar addSubview:searchBar];
b、搜索时执行的回调方法:

        在协议UISearchBarDelegate中,如- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;

c、搜索结果的展示:

        搜索结果的展示这里可以进行灵活的自定义。



2、UISearchDisplayController

        UISearchDisplayController在原有的UISearchBar上进行进一步的封装,直接将搜索框视图和搜索对象源绑定在一起,同时也对外提供了配置展示视图的入口.searchResultsTableView ,一般多用tableView作为搜索结果展示视图。



搜索时执行的方法在协议UISearchDisplayDelegate中,如方法

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller NS_DEPRECATED_IOS(3_0,8_0);等。


3、UISearchController

        在iOS8以后UISearchDisplayControllerUISearchController替换掉。UISearchController直接将 UISearchBar封装在了类内部,初始化的时候不再从外部传入UISearchBar,只需要将用于展示搜索结果的视图控制器传入。UISearchController将对搜索结果进行更新的代理者和监控UISearchBar事件响应的代理者分离开了,分别为.searchResultsUpdater和.delegate

a、创建代码:

SearchResultViewController *resultVC = [[SearchResultViewController alloc]init];
    self.searchControl = [[SearchViewController alloc]initWithSearchResultsController:resultVC];
    self.searchControl.delegate = self;
    self.searchControl.searchResultsUpdater = self;
    self.searchControl.searchBar.placeholder = @"请输入搜索内容";
    self.searchControl.dimsBackgroundDuringPresentation = NO;
    [self.searchControl.searchBar sizeToFit];
    //颜色设置
    _searchControl.searchBar.barTintColor = [UIColor orangeColor];
    //开启允许另一个tvc做呈现的控制器
//    self.definesPresentationContext = YES;
    self.tableView.tableHeaderView = self.searchControl.searchBar;

4、自定义搜索框视图的部分参数设置

    //光标颜色
    [[[_searchControl.searchBar.subviews objectAtIndex:0].subviews objectAtIndex:1] setTintColor:[UIColor XXX]];
    //字体颜色
    UITextField *searchField = [_searchControl.searchBar valueForKey:@"_searchField"];
    searchField.textColor = [UIColor XXX];
    //placeHolder颜色
    [searchField setValue:[UIColor XXX] forKeyPath:@"_placeholderLabel.textColor"];
    //取消按钮文字、颜色
    [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:[NSArray arrayWithObject:[UISearchBar class]]]setTintColor:[UIColor XXX]];
    [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:[NSArray arrayWithObject:[UISearchBar class]]]setTitle:@"XX"];
其中,修改cancel按钮为中文的大致有三种方式,但最好的就是上面这种处理方式。其余两种方式分别为:


a、文字更改:[searchBar setValue:@"取消" forKey:@"_cancelButtonText"];

      颜色设置:searchBar.tintColor = [UIColor XX];(注:这种方式可以达到需要的效果,但是在改变颜色的时候光标的颜色也会和 cancel按钮的颜色一致)


b、无论是上面哪种搜索的实现方式,在其输入信息便触发的方法里面执行以下代码:

      UIView *topView = searchBar.subviews[0];
       for (UIView *subView in topView.subviews) {

           if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) {

              UIButton *cancelButton = (UIButton*)subView;
               [cancelButton setTitle:@"取消" forState:UIControlStateNormal];  //@"取消"
               [cancelButton setTintColor:[UIColor whiteColor]];

            }

       }

(注:该方式英文变为中文没问题,但是当第一次出现“取消”按钮时,取消按钮的颜色仍是系统的,以后再出现便是我们自己所设置的颜色)

另外也可以采用a中的颜色设置和b中的中文内容设置结合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值