搜索UITableView单元时忽略特殊字符的UISearchBar

时间:2013-01-19 23:18:40

标签: ios objective-c xcode uisearchbar

感谢SO的帮助,我有一个很棒的UISearchBar来过滤我的UITableView。还有一个我想添加的功能。

我希望UISearchBar过滤器忽略特殊字符,如撇号,逗号,破折号等......并且如果用户键入“允许具有”Jim's Event“或”Jims-Event“等文本的单元格仍然出现吉姆斯事件“。

for (NSDictionary *item in listItems)
{

if ([scope isEqualToString:@"All"] || [[item objectForKey:@"type"]  
isEqualToString:scope] || scope == nil)
{
    NSStringCompareOptions opts = (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch);
    NSRange resultRange = [[item objectForKey:@"name"] rangeOfString:searchText
                                                     options:opts];
    if (resultRange.location != NSNotFound) {
    [filteredListItems addObject:item];
    }
}
}

有人有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

这个有点棘手。想到的第一个解决方案是从搜索和项目字符串中删除您故意不想匹配的任何字符,然后进行比较。您可以使用NSCharacterSet个实例进行过滤:

// Use this method to filter all instances of unwanted characters from `str`
- (NSString *)string:(NSString *)str filteringCharactersInSet:(NSCharacterSet *)set {
    return [[str componentsSeparatedByCharactersInSet:set]
            componentsJoinedByString:@""];
}

// Then, in your search function....
NSCharacterSet *unwantedCharacters = [[NSCharacterSet alphanumericCharacterSet] 
                                      invertedSet];
NSString *strippedItemName = [self string:[item objectForKey:@"name"] 
                 filteringCharactersInSet:unwantedCharacters];
NSString *strippedSearch = [self string:searchText
               filteringCharactersInSet:unwantedCharacters];

获得已剥离的字符串后,您可以使用strippedItemName代替[item objectForKey:@"name"]strippedSearch代替searchText进行搜索。

在您的示例中,这将:

  • 将搜索字符串“Jims Event”翻译为“JimsEvent”(剥离空间)
  • 将项目“Jim's Event”翻译为“JimsEvent”(剥离撇号和空格)
  • 匹配两者,因为它们是相同的字符串

在循环遍历项目名称之前,您可能会考虑剥离不需要的字符的搜索文本,而不是在循环的每次迭代中重做相同的工作。您还可以使用alphanumericCharacterSet以外的集合来过滤更多或更少的字符 - 请查看类参考以获取更多信息。

编辑:我们需要使用自定义函数来删除给定集中的所有字符。只使用-[NSString stringByTrimmingCharactersInSet:]只过滤字符串的结尾,而不是字符串中的任何位置。我们通过将原始字符串拆分为不需要的字符(在进程中删除它们),然后使用空字符串重新加入组件来解决这个问题。