使用搜索條UISearchBar 謂詞實現搜尋的判斷
阿新 • • 發佈:2019-01-23
searchBar有可以設定搜尋文字框上方的標題的屬性,右側取消按鈕(還有書籤按鈕,查詢結果按鈕)也都可以設定是否有,搜尋框的顏色,還可設定搜尋條的風格。
看下面第二副圖,我們可以設定帶分段的搜尋條,該屬性Shows scope Bar 與 Scope Titles。當用戶單擊分段條上指定的分段按鈕時,系統將會激發一個方法,從而允許程式通過該方法控制只對指定範圍的資料執行搜尋。點選每一部分都有自己的代理方法實現
下方是實現搜尋的具體程式碼:
首先我們要做的是在stroy中建立tableView和searchBar 並且要和IBOutlet關聯到程式碼當中:然後具體看下方
// // ViewController.m // 11111 // // Created by xxt-imac on 16/1/14. // Copyright © 2016年 xxt-imac. All rights reserved. // #import "ViewController.h" @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate> @property (strong, nonatomic) IBOutlet UITableView *table; @property (strong, nonatomic) IBOutlet UISearchBar *searchBar; //儲存原始表格資料的陣列 @property(strong,nonatomic)NSArray *dataArray; //儲存搜尋結果的資料的陣列 @property(strong,nonatomic)NSArray *searchArray; @property(assign,nonatomic)BOOL isSearch; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //初始化表格資料 _dataArray = [NSArray arrayWithObjects:@"哦;四姐夫",@"洛杉磯阿道夫徠卡是否",@"了快速和覅可還是",@"螺絲哦哈覅覅",@"阿斯頓客服或類似回覆",@"阿里山螺絲回覆",@"離開iu吧後is啊",@"苦海可能了卡舒服2",@"上來看回復了可能",@"客戶是否老",@"燒錄哈舒服老",@"ASF老卡是否",@"哦i換膚離開",@";拉絲粉開老老地方",@"老師發來看你撒", nil]; self.table.delegate =self; self.table.dataSource = self; _isSearch = NO; //設定搜尋條的delegate self.searchBar.delegate =self; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //如果處於搜尋狀態 if (_isSearch) { //使用searchArray作為表格顯示的資料 return _searchArray.count; }else { //否則使用原始的dataArray作為表格的顯示的資料 return _dataArray.count; } } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellID = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; } NSInteger rowNo = indexPath.row; //如果處於搜尋狀態 if (_isSearch) { //使用searchArray作為表格顯示的資料 cell.textLabel.text = [_searchArray objectAtIndex:rowNo]; }else{ cell.textLabel.text = [_dataArray objectAtIndex:rowNo]; } return cell; } -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { //取消搜尋狀態 _isSearch = NO; [self.searchBar resignFirstResponder]; [self.table reloadData]; } //當搜尋框中的文字發生變化時 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [self filterBySubstring:searchText]; } //當用戶點選虛擬鍵盤上的search按鈕時激發該方法 -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self filterBySubstring:searchBar.text]; [self.searchBar resignFirstResponder]; } -(void)filterBySubstring:(NSString *)subStr { //設定搜尋狀態 _isSearch = YES; //定義謂詞 NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c]%@",subStr]; //使用謂詞過濾NSArray _searchArray = [_dataArray filteredArrayUsingPredicate:pred]; //讓表格控制元件重新載入資料 [self.table reloadData]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
這是搜尋前和搜尋後的對比圖片,可以參考
搜尋前的圖片: 搜尋後的圖片:
補充:本文還有一個重點要掌握的就是謂詞
//定義謂詞
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c]%@",subStr];
//使用謂詞過濾NSArray
_searchArray = [_dataArray filteredArrayUsingPredicate:pred];
//讓表格控制元件重新載入資料
首先定義謂詞,然後執行上方程式碼就是實現了dataArray中的string不管有什麼substr與searchArray中的string中的substr一樣,那麼dataArray中的string就會被挑選出來放在searchArray當中。簡單的說就是不管dataArray中那個字與searchArray中的任何一個字相等,那麼有這個字的字串就會成為searchArray中的一員。