searchUITableView单元格时忽略特殊字符的UISearchBar

感谢这些人的帮助,我有一个伟大的UISearchBar过滤我的UITableView。 还有一个我想添加的function。

我希望UISearchBarfilter忽略撇号,逗号,短划线等特殊字符,如果用户键入“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]; } } } 

有人有主意吗? 谢谢!

这个有点棘手。 想到的第一个解决scheme是从search和项目string中删除任何你不想匹配的字符,然后进行比较。 你可以使用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]; 

一旦你有了剥离的string,你可以使用strippedItemName代替[item objectForKey:@"name"]strippedSearch代替[item objectForKey:@"name"]来进行search。

在你的例子中,这将会:

  • 将searchstring“Jims Event”翻译成“JimsEvent”(剥离空间)
  • 将项目“Jim's Event”翻译成“JimsEvent”(剥离撇号和空格)
  • 匹配这两个,因为它们是相同的string

您可能会考虑在您循环显示项目名称之前,先删除不需要的字符的search文本,而不是在循环的每次迭代中重做相同的工作。 您也可以使用alphanumericCharacterSet以外的集合来过滤更多或更less的字符 – 查看更多的类引用。

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