1

MPMediaQueryユーザーのライブラリで曲のタイトルを検索するために を使用しています。

MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:titleString
                                                                            forProperty:MPMediaItemPropertyTitle
                                                                         comparisonType:MPMediaPredicateComparisonContains];

MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate: titlePredicate];


NSArray* result = query.items;

titleStringNSStringユーザーが入力した で、 から取得されますUISearchField。ほとんどの場合、これで問題なく動作しますが、失敗する場合もあります。デスクトップで iTunes を使用している場合、「holle」を検索すると、「Der Hölle Rache」が見つかります。これは私のアプローチではうまくいきません。同様に、「que」を検索しても「Qué pasa?」は見つかりません。これを修正する方法はありますか?

4

1 に答える 1

0

MPMediaPropertyPredicate現在、 を指定することはできませんNSStringCompareOptions。この状況では、アクセント記号やその他の発音記号を無視する、分音記号を区別しない検索が必要になります。

回避策の 1 つ (ただし、ライブラリのサイズによっては理想よりも遅くなります) は、次のメソッドを使用して分音記号と大文字と小文字を区別しない検索を使用して、メディア ライブラリ全体を反復処理すること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];
于 2012-11-16T02:43:27.357 に答える