1

我正在尝试实现对我的应用程序的搜索。如果您在搜索栏中写了一个确切的单词,那没关系,但是例如,如果我想查找“book”并输入“böök”,变音符号应该无关紧要。我正在使用下面的代码,但它没有用,并且在搜索“New York - Björk”时也失败了。我也尝试了不同的 searchEditedText 组合,但代码变得很恶心。我怎样才能做到这一点?

NSString *searchText = [searchBar.text capitalizedString];
NSString *searchEditedText=[searchBar.text capitalizedString];
NSMutableArray *searchArray = [[[NSMutableArray alloc] init] autorelease];
for (NSDictionary *dictionary in listOfItems) {
  NSArray *array = [dictionary objectForKey:@"Names"];
  [searchArray addObjectsFromArray:array];
}
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"u" withString:@"ü"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"c" withString:@"ç"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"U" withString:@"Ü"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"C" withString:@"Ç"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"o" withString:@"ö"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"O" withString:@"Ö"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"g" withString:@"ğ"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"G" withString:@"Ğ"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"s" withString:@"ş"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"S" withString:@"Ş"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"i" withString:@"ı"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"İ" withString:@"I"];
for (NSString *sTemp in searchArray) {
  NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch];
  NSRange titleResultsRange2 = [sTemp rangeOfString:searchEditedText options:NSCaseInsensitiveSearch];
  if (titleResultsRange2.length > 0 || titleResultsRange.length > 0) {
    [copyListOfItems addObject:sTemp];
  }
}
4

3 回答 3

4

如果您使用的是 Core Data,则可以使用 NSPredicate 以不区分大小写和变音符号的方式进行搜索。这个问题的答案是执行不区分大小写的搜索,如果您添加[cd]作为比较的一部分,例如contains[cd]or ==[cd],那么它将执行不区分大小写和变音符号的搜索。

于 2012-07-14T09:44:09.780 回答
2

事实上,你可以这样做:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Names CONTAINS[cd] %@",searchText];

searchArray = [[listOfItems filteredArrayUsingPredicate:predicate] mutableCopy];

因为 NSPredicate 可以忽略 unicode,所以 searchArray 就是你想要的。

于 2012-08-15T03:38:13.287 回答
1

您是否尝试仅使用现有代码并替换所有实例

NSCaseInsensitiveSearch

NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch|NSWidthInsensitiveSearch

? 这似乎会以最直接的方式解决您的问题。

如果您想böök匹配book反之,请参阅此答案böök,了解在搜索之前去除变音符号的方法。但这很容易出错,而且可能不是你真正想做的。

于 2013-04-10T18:36:08.230 回答