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.pswp.cn/news/283760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283760.shtml
英文地址,請注明出處:http://en.pswp.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%的用…

oracle臨時表空間

--查看臨時表空間SELECT * FROM v$tablespace;SELECT * FROM dba_tablespaces;--查看所有臨時表空間文件SELECT * FROM dba_data_files;--查看臨時臨時表空間文件SELECT * FROM dba_temp_files;--查看臨時表空間組SELECT * FROM dba_tablespace_groups; --查找默認臨時表空間SE…

ES 2022 正式發布!有哪些新特性?

2022 年 6 月 22 日&#xff0c;第 123 屆 Ecma 大會批準了 ECMAScript 2022 語言規范[1]&#xff0c;這意味著它現在正式成為標準。 1 ECMAScript 2022編輯 本次發布的編輯有&#xff1a; Shu-yu Guo[2] Michael Ficarra[3] Kevin Gibbons[4] 2 ECMAScript 2022有什么新內…

聯想(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&…

Tensorflow之安裝

1.fellow the instruction of https://www.tensorflow.org/install/install_linux#installing_with_anaconda 2.anaconda安裝&#xff0c;修改~/.bash_profile為 export PATH~/anaconda2/bin:/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH/usr/local/cuda/lib64:$LD_LIBRAR…

2、Saltstack的數據系統

一、Grainsgrains是salt用來收集minion端底層系統信息的接口。比如&#xff0c;操作系統type、域名 、IP地址、內存及其他相關系統屬性信息等。存儲在minion端&#xff0c;用于保存minion端數據信息。minion啟動時才加載grains信息&#xff0c;所以他時靜態的&#xff0c;Grain…

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

寫在前面在日常開發中&#xff0c;我這邊比較熟悉的配置中心有&#xff0c;攜程Apollo&#xff0c;阿里Nacos(配置中心&#xff0c;服務治理一體)之前文章&#xff1a;Asp.Net Core與攜程阿波羅(Apollo)的第一次親密接觸總體來說&#xff0c;Apollo和Nacos社區都比較活躍&#…

stop-hbase.sh一直處于等待狀態

今天關閉HBase時&#xff0c;輸入stop-hbase.sh一直處于等待狀態 解決方法&#xff1a; 先輸入&#xff1a;hbase-daemon.sh stop master 再輸入&#xff1a;stop-hbase.sh就可以關閉HBase集群了。 轉載于:https://www.cnblogs.com/lijinze-tsinghua/p/8667761.html

shell編程100例

1、編寫hello world腳本 #!/bin/bash# 編寫hello world腳本echo "Hello World!"2、通過位置變量創建 Linux 系統賬戶及密碼 #!/bin/bash# 通過位置變量創建 Linux 系統賬戶及密碼#$1 是執行腳本的第一個參數,$2 是執行腳本的第二個參數 useradd "$1" …

sqlserver 分頁

select top 10 numComImg.* from( select row_number() over(order by id asc) as rownumber,* from (select * FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)as numComImg where rownumber>40select top 10 * --10 為頁大小from [TCCLine].[dbo].[CLine_CommonIma…

詳解SpringMVC中Controller的方法中參數的工作原理[附帶源碼分析] good

目錄 前言現象源碼分析 HandlerMethodArgumentResolver與HandlerMethodReturnValueHandler接口介紹HandlerMethodArgumentResolver與HandlerMethodReturnValueHandler接口的具體應用常用HandlerMethodArgumentResolver介紹常用HandlerMethodReturnValueHandler介紹本文開頭現象…

instancing render

當要繪制同一個東西很多次的時候&#xff0c;最簡單的想法可能是循環調用glDrawArrays()&#xff0c;但這樣會造成性能的損失。因為當顯卡在渲染一個物體的時候&#xff0c;可能并不需要太多時間&#xff0c;但系統會花大量的時間&#xff0c;頻繁的調用draw命令&#xff0c;再…

對不起,我不是一個自律的人

大家好&#xff0c;我是 &#x1f41f;&#x1f4a8;。前天&#xff0c;星球 的一位大學生朋友問了我幾個問題&#xff1a;你大學時如何安排每日的時間&#xff1f;為什么能學那么多技術&#xff1f;你會學習到很晚嗎&#xff1f;你是如何保持自律的&#xff1f;我覺得這幾個問…