当前位置: 首页 > news >正文

iOS开发实战之搜索控制器UISearchController使用

当tableView中的数据过多的时候,在tableView上加一个搜索框就变的很必要了,本文就讨论搜索控制器的使用,以及谓词的简单实现。

.m文件中代码如下 
添加搜索控制器的各种协议

<UISearchBarDelegate,UISearchResultsUpdating,UIAlertViewDelegate>

创建两个实例和数据源

{
 NSArray * _dataSource;
}
@property(nonatomic,strong)UISearchController *searchController;//搜索控制器
@property (strong, nonatomic)NSMutableArray  *searchList;//满足搜索条件的数组

初始化搜索控制器的各种属性

-(void)initMysearchBarcontroller
{
    _searchController=[[UISearchController  alloc]initWithSearchResultsController:nil];
    //设置背景不透明
    _searchController.searchBar.translucent=NO;
    _searchController.searchBar.barTintColor=[UIColor brownColor];

    //设置searchbar的边框颜色和背景颜色一致
    _searchController.searchBar.layer.borderWidth=1;
    _searchController.searchBar.layer.borderColor=[[UIColor brownColor] CGColor];
    _searchController.searchBar.placeholder=@"搜索联系人";
    _searchController.searchResultsUpdater = self;
    _searchController.dimsBackgroundDuringPresentation = NO;
    _searchController.hidesNavigationBarDuringPresentation = NO;
    _searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44);
    _searchController.searchBar.delegate=self;
    self.tableView.tableHeaderView = self.searchController.searchBar;
    //清空tableview多余的空格线
    [self.tableView setTableFooterView:[[UIView alloc]initWithFrame:CGRectZero]];

}

在输入搜索框中输入文本执行的代理函数

//每输入一个字符都会执行一次
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSString *searchString = [self.searchController.searchBar text];
    //谓词搜索
    NSPredicate *preicate = [NSPredicate predicateWithFormat:@"SELF.name CONTAINS[c] %@", searchString];

    if (self.searchList!= nil) {
        [self.searchList removeAllObjects];
    }

    //过滤数据
    self.searchList= [NSMutableArray arrayWithArray:[_dataSource filteredArrayUsingPredicate:preicate]];
    //刷新表格

    [self.tableView reloadData];

}

在这个时候 就可以获得符合你的搜索条件的数值了。 
如果你想改变tableView的显示内容,记得reloadData。

NSPredicate *preicate = [NSPredicate predicateWithFormat:@"SELF.name CONTAINS[c] %@", searchString];

这里的SELF.name就是你数据源里的model的属性。SELF就是model的类,这里是按照名字搜索。

获取到筛选数组后,就要改你的tableView上显示的东西了。 
例如:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//控制器使用的时候,就是点击了搜索框的时候
    if (self.searchController.active) {
        return self.searchList.count;
    }
//控制器未使用的时候
    return _dataSource.count;
}

还有其他tableView的代理函数也要改。

全部写完后,会发现点了搜索框之后右边有个取消的英文。怎么变中文呢,如下

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:YES animated:YES];
    for (id obj in [searchBar subviews]) {
        if ([obj isKindOfClass:[UIView class]]) {
            for (id obj2 in [obj subviews]) {
                if ([obj2 isKindOfClass:[UIButton class]]) {
                    UIButton *btn = (UIButton *)obj2;
                    [btn setTitle:@"取消" forState:UIControlStateNormal];
                }
            }
        }
    }
    return YES;
}

怎么截取那个取消按钮的代理呢,给你官方的。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar;                      // return NO to not become first responder
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;                     // called when text starts editing
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar;                        // return NO to not resign first responder
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar;                       // called when text ends editing
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;   // called when text changes (including clear)
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text NS_AVAILABLE_IOS(3_0); // called before text changes

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar;                     // called when keyboard search button pressed
- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar __TVOS_PROHIBITED; // called when bookmark button pressed
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar __TVOS_PROHIBITED;   // called when cancel button pressed
- (void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar NS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED; // called when search results button pressed

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope NS_AVAILABLE_IOS(3_0);

原文链接:https://blog.csdn.net/clmd_ld/article/details/50782510/

转载于:https://www.cnblogs.com/lishanshan/p/10107782.html

相关文章:

  • 饭卡
  • mysql索引原理与查询优化
  • protobuf中文教程(第一篇)
  • ASP.Net Core The type initializer for 'Gdip' threw an exception
  • js变量前的+是什么意思
  • ActiveMQ消息的消费原理
  • 下拉框搜索插件chosen
  • Vue -computed传参数
  • bzoj 2535 bzoj 2109 [Noi2010]Plane 航空管制——贪心
  • redis面试题集錦
  • 安卓创始人计划推出能帮你约会的AI手机
  • 2 -6 元祖
  • 中科大自主招生2018年笔试数学之四
  • 耄耋的三星,蹒跚的步履
  • 算法第5章上机实践
  • 【Amaple教程】5. 插件
  • 03Go 类型总结
  • 07.Android之多媒体问题
  • AngularJS指令开发(1)——参数详解
  • create-react-app项目添加less配置
  • Docker: 容器互访的三种方式
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • javascript面向对象之创建对象
  • js继承的实现方法
  • Linux Process Manage
  • 包装类对象
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 入门到放弃node系列之Hello Word篇
  • 一份游戏开发学习路线
  • 中文输入法与React文本输入框的问题与解决方案
  • 主流的CSS水平和垂直居中技术大全
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###项目技术发展史
  • (2022 CVPR) Unbiased Teacher v2
  • (C#)一个最简单的链表类
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (三)终结任务
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (算法)Travel Information Center
  • (五)网络优化与超参数选择--九五小庞
  • (一)appium-desktop定位元素原理
  • (一)插入排序
  • (转)mysql使用Navicat 导出和导入数据库
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ***检测工具之RKHunter AIDE
  • .Net 垃圾回收机制原理(二)
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET导入Excel数据