IOS_SearchBar搜索栏及关键字高亮

搜索框的效果演示:

 

 

这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能.

我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示:

?
1
2
3
4
5
6
//获取文件的路径path
NSString *path = [[NSBundle mainBundle] pathForResource:@"heros" ofType:@"txt"];
//将路径下的文件转换成NSData数据
NSData *data = [NSData dataWithContentsOfFile:path];
//将得到的NSdata数据进行JSON解析并返回一个结果数组result
id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

我们再来看数据的层级关系:



 

这里解释下,这个层级关系是通过在线代码格式化网页得到的,我们上一步所做的数据处理就是将原始数据进行处理,得到一个结果数组,他的层级关系和格式化后一样,这样就可以根据格式化网页上的层级关系来进一步处理数据,将需要的内容放入数组或者字典(当然也可以直接打印result来看层级关系,看个人习惯).

那么我们所需要的内容就是字典中nick所对应的值,通过遍历将其取出来放入数组中,这里将这个数组定义为属性,在其他方法里会用到.

?
1
2
3
4
// 将搜索范围的内容放入数组
for (NSDictionary *diction in result) {
  [self.arrOfSeachBoxes addObject:diction[@"nick"]];
 }

接下来我们创建一个UITableView用来显示数据,搜索条需要用到的类是UISearchController,先看看如何创建:

系统的注释说的很清楚,如果想要在当前页显示搜索结果,这个方法的参数填nil即可,为了方便起见,声明一个UISearchController的属性

?
1
@property (nonatomic, retain) UISearchController *searchController;

接下来是创建

?
1
2
// nil表示在当前页面显示搜索结果
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];

UISearchController头文件中被放在非常靠前的位置的是一个属性

根据字面意思我们可以猜到这跟搜索结果的更新有关,就跟tableViewreloadData一个意思.那么很明显,我们得签协议<UISearchResultsUpdating>,这个协议中只有一个必须要实现的方法.

?
1
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController;

头文件如下图所示:

---------这里是美丽的分割线---------

上面已经把所有关于搜索条的类和方法罗列了一下,下面来捋一捋

所有定义的属性如下所示:

?
1
2
3
4
5
6
7
8
NS_ASSUME_NONNULL_BEGIN
@interface ViewController () <UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating>
@property (nonatomic, retain) NSMutableArray *arrOfSeachBoxes;/**< 搜索范围 */
@property (nonatomic, retain) NSMutableArray *arrOfSeachResults;/**< 搜索结果 */
@property (nonatomic, retain) UISearchController *searchController;
@property (nonatomic, retain) UITableView *tableView;
@end
NS_ASSUME_NONNULL_END

数据处理相关代码如下:

?
1
2
3
4
5
6
7
8
9
// 解析数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"heros" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
self.arrOfSeachBoxes = [NSMutableArray array];
// 将搜索范围的内容放入数组
for (NSDictionary *dic in result) {
 [self.arrOfSeachBoxes addObject:dic[@"nick"]];
}

和UISearchController的创建相关代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
//searchBar的frame
self.searchController.searchBar.frame = CGRectMake(0, 44, 0, 44);
// 是否需要在输入搜索内容时变暗
self.searchController.dimsBackgroundDuringPresentation = false;
self.searchController.searchBar.showsCancelButton = YES;/**< 取消按钮 */
self.searchController.searchResultsUpdater = self;/**< 显示搜索结果的VC */
self.searchController.active = YES;/**< 搜索结果显示 */

和tableView相关的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// tableView
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.bounds.size.width, self.view.bounds.size.height - 20) style:UITableViewStylePlain];
[self.view addSubview:self.tableView];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"pool"];
//将SearchBar放在tableView的头部视图
self.tableView.tableHeaderView = self.searchController.searchBar;

UISearchResultsUpdating协议方法代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
//初始化存储搜索结果的数组
self.arrOfSeachResults = [NSMutableArray array];
// 获取关键字
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchController.searchBar.text];
// 用关键字过滤数组中的内容, 将过滤后的内容放入结果数组
self.arrOfSeachResults = [[self.arrOfSeachBoxes filteredArrayUsingPredicate:predicate] mutableCopy];
// 完成数据的过滤和存储后刷新tableView.
[self.tableView reloadData];
}

tableView的DataSource

?
1
2
3
4
5
6
7
8
9
10
11
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// 显示搜索结果时
if (self.searchController.active) {
 //以搜索结果的个数返回行数
 return self.arrOfSeachResults.count;
}
 //没有搜索时显示所有数据
 return self.arrOfSeachBoxes.count;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"pool"];
// 显示搜索结果时
if (self.searchController.active) {
// 原始搜索结果字符串.
NSString *originResult = self.arrOfSeachResults[indexPath.row];
// 获取关键字的位置
NSRange range = [originResult rangeOfString:self.searchController.searchBar.text];
// 转换成可以操作的字符串类型.
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:originResult];
// 添加属性(粗体)
[attribute addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20] range:range];
// 关键字高亮
[attribute addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
// 将带属性的字符串添加到cell.textLabel上.
[cell.textLabel setAttributedText:attribute];
cell.textLabel.text = self.arrOfSeachResults[indexPath.row];
 } else {
 cell.textLabel.text = self.arrOfSeachBoxes[indexPath.row];
  }
 return cell;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

工厂模式&#xff1a; 工厂模式可以分为三类&#xff1a; 1&#xff09;简单工厂模式&#xff08;Simple Factory&#xff09; 2&#xff09;工厂方法模式&#xff08;Factory Method&#xff09; 3&#xff09;抽象工厂模式&#xff08;Abstract Factory&#xff09; 简单工…

今天很多 CTO 都是被干掉的,因为他没有成就业务

作者&#xff5c;乔新亮 编辑&#xff5c;邓艳琴 我可以丝毫不开玩笑地说&#xff0c;今天&#xff0c;很多传统企业里的研发都只是“工人”&#xff0c;哪怕是 CTO&#xff0c;充其量也只是“高级工人”&#xff0c;如果不转换思维去成就业务&#xff0c;就只能停留在工人级…

中航工业集团金网络(北京)电子商务有限公司副总经理刘正珩:航空“智”造的供应链支撑平台...

编者按 “十三五”时期是我国贸易发展的重要战略机遇期&#xff0c;物流产业发展迅速&#xff0c;智慧供应链已经成为推动流通大国向流通强国过程中的重要行动。6月2日&#xff0c;由上海市国有资产监督管理委员会、上海市邮政管理局、上海市商务委员会指导&#xff0c;上海市国…

创建、检查和反编译世界上(几乎)最短的 C# 程序

创建、检查和反编译世界上&#xff08;几乎&#xff09;最短的 C# 程序原文来自https://www.stevejgordon.co.uk/creating-inspecting-decompiling-the-worlds-smallest-csharp-program在这篇文章中&#xff0c;我认为创建世界上&#xff08;几乎&#xff09;最短的 C# 程序然后…

Linux下画原理图和PCB

Linux下画原理图和PCBWindows下大名鼎鼎的Allegro和经典的Protel 99SE都是不支持Linux操作系统的。做Linux驱动开发免不了要看一下原理图和PCB。一般的做法有三种&#xff1a; 1.主机使用Windows系统&#xff0c;将Linux装在VMWARE之类的虚拟机中这样能够使用Windows下的软件看…

配置中心 App Configuration (二):Feature Flag 功能开关特性

写在前面Web服务开发过程中我们经常有这样的需求&#xff1a;某些功能我必须我修改了配置才启用&#xff0c;比如新用户注册送券等&#xff1b;某个功能需到特定的时间才启用&#xff0c;过后就失效&#xff0c;比如春节活动等&#xff1b;某些功能&#xff0c;我想先对10%的用…

联想(Lenovo)小新310经典版进bios方法

1&#xff0c;找到novo按钮。 2&#xff0c;在关机的状态下桶一下小孔&#xff0c;不用任何操作&#xff0c;电脑进入bios选择界面。转载于:https://www.cnblogs.com/senior-engineer/p/6761457.html

C#中的匿名类型

这节来讲一下C#中的匿名类型。匿名类在C#中&#xff0c;我们可以不去显示的声明一个类&#xff0c;而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。声明一个匿名类&#xff0c;我们可以像下面这样做&#xff1a;var Anonymousnew {name"charles",year…

MySQL之MHA高可用集群

目录 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的组成 1.3.MHA 的特点 二、MHA搭建准备 2.1.实验思路 三、MHA搭建 3.1配置主从复制 3.2.安装 MHA 软件 3.3.故障模拟 3.4.故障修复 四、总结 一、MHA概述 1.1.MHA 是什么 1.MHA&#xff08;MasterHigh Availability&…

配置中心 App Configuration (一):轻松集成到Asp.Net Core

写在前面在日常开发中&#xff0c;我这边比较熟悉的配置中心有&#xff0c;携程Apollo&#xff0c;阿里Nacos(配置中心&#xff0c;服务治理一体)之前文章&#xff1a;Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触总体来说&#xff0c;Apollo和Nacos社区都比较活跃&#…

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言现象源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用常用HandlerMethodArgumentResolver介绍常用HandlerMethodReturnValueHandler介绍本文开头现象…

对不起,我不是一个自律的人

大家好&#xff0c;我是 &#x1f41f;&#x1f4a8;。前天&#xff0c;星球 的一位大学生朋友问了我几个问题&#xff1a;你大学时如何安排每日的时间&#xff1f;为什么能学那么多技术&#xff1f;你会学习到很晚吗&#xff1f;你是如何保持自律的&#xff1f;我觉得这几个问…

保证接口数据安全的10种方案

前言 大家好&#xff0c;我是程序汪&#xff0c;互联网项目需要特别注意数据安全&#xff0c;如果你简历上是互联网类型项目&#xff0c;安全方面肯定要能说出个一二三&#xff0c;下面分享下这方面的干货&#xff0c;大家可以记住几条&#xff0c;面试时好说道说道 我们日常…

Html5本地存储LocalStorage

HTML5 提供了两种在客户端存储数据的新方法&#xff1a; localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储在浏览器中打开审查元素&#xff08;如谷歌F12&#xff09;&#xff0c;在Resources下面可以查看里面的数据。 localStorage提供了几…

java第一季2.2

2019独角兽企业重金招聘Python工程师标准>>> 标识符&#xff1a; 是给变量类方法命名的符号、标识符开头可以_、字母、$命名&#xff0c;不可以用数字命名。关键字不可命名&#xff0c;大小写区分。不可以用非法字符 变量&#xff1a;变量类型。变量名。变量值。如&…

读《华为数字化转型之道》

数字化转型应该很多人都听过&#xff0c;但如果你做过 ToB 软件&#xff0c;听得更多的是信息化&#xff0c;那信息化和数字化是什么关系呢&#xff1f;下面用一个小例子来说说我的理解。记得刚上初中的时候&#xff0c;平时测验、考试的试卷&#xff0c;都是人工在板上进行刻写…

Thrift基本原理及使用

参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call)&#xff0c;远程过程调用&#xff0c;大部分的RPC框架都遵循如下三个开发步骤&#xff1a; 1. 定义一个接口说明文件&#xff1a;描述了对象(结构体)、对象成员、接口方法等一系列信息&am…

01-H5语义化标签

转载于:https://www.cnblogs.com/Zeki/p/5901399.html

配置中心 App Configuration (三):配置的动态更新

Get Azure key-value pairs from App configuration | Serverless360写在前面我在前文&#xff1a;《微软Azure配置中心 App Configuration (一)&#xff1a;轻松集成到Asp.Net Core》已经介绍了Asp.net Core怎么轻易的接入azure 配置中心App Configuration(下称azure 配置中心…

万字总结 JS 数据结构与常用的算法

前言 首先&#xff0c;为什么我会学习数据结构与算法呢&#xff0c;其实主要是有两方面 第一&#xff0c;是我在今年的flag里明确说到我会学这个东西第二&#xff0c;学了这些&#xff0c;对自己以后在工作或者面试也会带来许多好处然后&#xff0c;本文是最近学习的一个总结文…