iOS - 標準化搜索UISearchBar ??

轉自:http://www.lxweimin.com/p/70b4f9c0cc4e

寫app的時候經常會遇到需要進行本地模糊搜索的場景,然后我想能不能直接寫成標準化的,傳入model數據源 然后指定搜索字段,最后傳出過濾后的model數組形成標準化任何地方都適用。直接貼代碼

首先寫一個類擴展繼承于NSObject利用拿到這個model指定key的value

- (NSMutableString *)GetPropertyValueStrArr:(NSArray *)arr{

    NSMutableString *mstr = [[NSMutableString alloc]init];

    for (int i = 0; i<arr.count; i++){

        NSString *propertyName = arr[i];

        id propertyValue = [self valueForKey:(NSString *)propertyName];

        if (propertyValue){

            if ([self zhongwen:propertyValue]) {
                //中文轉英文

                propertyValue = [ChineseToPinyin pinyinFromChiniseString:propertyValue];

            }else if ([self yingwen:propertyValue]) {

                //英文轉大寫

                propertyValue = [propertyValue uppercaseString];
            }
            [mstr appendFormat:@"%@",propertyValue];
        }
    }

    return mstr;
}


- (BOOL)yingwen:(NSString*)str
{
    //正則 a-z  A-Z
    NSString *passWordRegex = @"[a-zA-Z]";

    //正則匹配
    NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex];

    //截取第一個字符判斷
    BOOL a = [passWordPredicate evaluateWithObject:[str substringToIndex:1]];

    return a ;
}


//判斷是否為中文
- (BOOL)zhongwen:(NSString*)str{

    //截取第一個字符
    NSString*sub = [str substringToIndex:1];

    unichar c = [sub characterAtIndex:0];
    if (c >=0x4E00 && c <=0x9FFF)
        return YES ;
    return NO;
}

然后在寫一個SearchBarView繼承于UISearchBar

.h

//需要去搜索的指定字段
@property (nonatomic,strong)NSArray *searchKyeArr;

//搜索數據源
@property (nonatomic,strong)NSMutableArray *dataArr;

@property (nonatomic,copy)void(^searchResult)(NSMutableArray *result);
.m

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{

    _searchResultArr = [NSMutableArray array];

    for (int i = 0; i < _dataArr.count; i ++) {

        if (searchText.length > 0) {

            if ([self zhongwen:searchText]) {

                searchText = [self pinyinFromChiniseString:searchText];


            }else if ([self yingwen:searchText]) {

                searchText = [searchText uppercaseString];
            }
        }



        id model = _dataArr[i];

        NSMutableString *searchStr = [model GetPropertyValueStrArr:_searchKyeArr];

        NSRange range = [searchStr rangeOfString:searchText];


        if (range.length > 0) {

            if (![_searchResultArr containsObject:model]) {

                [_searchResultArr addObject:model];
            }

        }else{

            [_searchResultArr removeObject:model];

        }
    }

    if (searchText.length > 0) {

        self.searchResult(_searchResultArr);

    }else{

        self.searchResult(_dataArr);

    }
}

完成。任何列表只要傳入數據源,和指定需要搜索這個數據源里面model的字段就可也完成搜索。

漢字搜索對比圖.png

字母搜索對比圖.png

Demo地址:https://github.com/ZhichaoZhan/iOS---UISearchBar

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容