我正在使用MPMediaQuery在用户的库中搜索歌曲标题:
MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:titleString
forProperty:MPMediaItemPropertyTitle
comparisonType:MPMediaPredicateComparisonContains];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate: titlePredicate];
NSArray* result = query.items;titleString是由用户输入并取自UISearchField的NSString。这在大多数情况下工作得很好,但在某些情况下会失败:当你在桌面上使用iTunes时,你可以搜索'holle‘,它会找到'Der Hölle Rache’。这不适用于我的方法。同样的,搜索'que‘也找不到’quépasa?‘。有没有办法解决这个问题?
发布于 2012-11-16 10:43:27
MPMediaPropertyPredicate当前不允许您指定任何NSStringCompareOptions。这种情况需要不敏感的变音符号搜索,它将忽略任何重音符号或其他变音符号。
一种解决方法(尽管速度比理想的要慢,取决于库的大小)是使用NSString rangeOfString:options:方法使用变音符号和不区分大小写的搜索遍历整个媒体库:
MPMediaQuery *query = [[MPMediaQuery alloc] init];
NSArray *result = query.items;
NSString *searchString = @"que";
NSIndexSet *filteredSet = [result indexesOfObjectsWithOptions:NSEnumerationConcurrent
passingTest:^BOOL(MPMediaItem *song, NSUInteger idx, BOOL *stop) {
NSString *songTitle = [song valueForProperty:MPMediaItemPropertyTitle];
NSRange foundRange = [songTitle rangeOfString:searchString
options:NSDiacriticInsensitiveSearch | NSCaseInsensitiveSearch];
// rangeOfString:options: returns {NSNotFound, 0} if "que" is not found during search.
if (foundRange.location != NSNotFound) {
return YES;
} else
return NO;
}];
NSArray *filteredResult = [result objectsAtIndexes:filteredSet];https://stackoverflow.com/questions/13296803
复制相似问题