OC界面搜索判断方式 及支持大小写模糊搜索

通常搜索是UI相关的功能,页面(viewController)上给table配了searchBar。table有个数据源dataSource,在searchBar输入filterText后,用filterText去筛选dataSource,得到最新的filteredDataSource,然后用filteredDataSource进行展示。

根据不同的filter方式,有不同的大小写模糊搜索方式。这个不同主要是【判断a是否包含keyword】的方式的不同。

判断方式1:rangeOfString

遍历dataSource,对每个对象用rangeOfString判断是否包含keyword。

判断语句:if ([a rangeOfString:keyword].location == NSNotFound) 

改造方式:添加options NSCaseInsensitiveSearch。

改造后:if ([a rangeOfString:keyword option:NSCaseInsensitiveSearch].location == NSNotFound)

扩展知识:options还支持其他搜索模式,参考:iOS开发中,NSString的比较用法_xcode nsstring 对比_xiaojin38的博客-CSDN博客

判断方式2:containsString

遍历dataSource,对每个对象用containsString判断是否包含keyword。

判断语句:if ([a containsString:keyword]) 

改造方式:将字符串转为小写lowercaseString(同理大写uppercaseString和首字母大写capitalizedString也可以用)

改造后:if ([a.lowercaseString containsString:keyword.lowercaseString]) 

判断方式3:NSPredicate

这种方式很简约,不用写遍历,判断方式predicateWithFormat为rangeOfString或containsString都可以。不过不适合debug。

筛选方式举例:

-(void)updateFilterdData {
    // 1. 清空self.filterdDataSource
    // 2. 搜索匹配规则
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", keyword]; 
    // 3. 应用规则筛选
    [self.filterdDataSource addObjectsFromArray:[self.dataSource filteredArrayUsingPredicate:predicate]];
}

改造方式:根据predicateWithFormat里的判断方式选择改造方式,只需要修改NSPredicate。

改造后:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.lowercaseString CONTAINS %@", keyword.lowercaseString]; 

扩展知识:NSPredicate还可以用于NSString类型之外的搜索,除了CONTAINS还支持其他的搜索设置,参考:NSPredicate predicateWithFormat方法支持的格式_james_1010的博客-CSDN博客

【written by Sneexy】

你可能感兴趣的:(OC,objective-c,模糊搜索)