1

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

我希望 UISearchBar 过滤器忽略撇号、逗号、破折号等特殊字符......并允许在用户键入“Jims Event”时仍然出现带有“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];
    }
}
}

有人有想法么?谢谢!

4

1 回答 1

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];

获得剥离的字符串后,您可以使用strippedItemNamein place of[item objectForKey:@"name"]strippedSearchin place of 进行搜索searchText

在您的示例中,这将:

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

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

编辑:我们需要使用自定义函数来删除给定集中的所有字符。仅使用字符串末尾-[NSString stringByTrimmingCharactersInSet:]的过滤器,而不是字符串中的任何地方。我们通过将原始字符串拆分为不需要的字符(在此过程中删除它们),然后使用空字符串重新连接组件来解决此问题。

于 2013-01-19T23:29:21.137 回答