1. 程式人生 > >使用搜索條UISearchBar 謂詞實現搜尋的判斷

使用搜索條UISearchBar 謂詞實現搜尋的判斷

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中的一員。