1

次のコードは、曲のリストを分割してセクションを追加するために使用されます。

    query = [MPMediaQuery songsQuery];
    [query addFilterPredicate: artistNamePredicate];            
    NSArray *itemsFromArtistQuery = [query items];  
    self.artist1 = [self partitionObjects:itemsFromArtistQuery collationStringSelector:@selector(title)];

完璧に動作します。しかし、私がそれをやろうとすると:

    query = [MPMediaQuery albumsQuery]; //same with playlistsQuery, artistsQuery, genresQuery
    [query addFilterPredicate: artistNamePredicate];            
    NSArray *itemsFromArtistQuery = [query collections];    
    self.artist1 = [self partitionObjects:itemsFromArtistQuery collationStringSelector:@selector(title)];

毎回 SIGABRT エラーが発生します。それがブロック全体の唯一の違いであるため、コードの「コレクション」部分に起因すると考えました。「タイトル」を「名前」、「アルバムタイトル」、「プレイリスト」、「ジャンル」などに変更しようとしましたが、それでも次のようになります。

"-[MPConcreteMediaItemCollection title]: unrecognized selector sent to instance"

ここで誰か助けてくれませんか?私は私の髪を引き裂く準備ができています !

ありがとうございました!

ベンベン

4

1 に答える 1

2

問題はコレクション部分にあるということは正しいです。は、渡したオブジェクトのcollationStringSelector:を返すメソッドである必要があります。NSStringこの場合は MPMediaItemCollectionです。

MPMediaItem( に応答する を渡していたので、最初のケースではうまくいきましたtitle)。

ここではMPMediaItemCollection、配列からそれぞれを選択し、コレクション全体を表すartistCollections単一のものを取得します。MPMediaItem次に、アーティスト名を取得して配列に追加できます。

query = [MPMediaQuery albumsQuery]; //same with playlistsQuery, artistsQuery, genresQuery
[query addFilterPredicate: artistNamePredicate];            
NSArray *artistCollections = [query collections];
NSMutableArray *artists = [NSMutableArray array];

for (MPMediaItemCollection *artist in artistCollections) {
    // get a single MPMediaItem that represents the collection
    MPMediaItem *representativeItem = [artist representativeItem];
    NSString *artistName = [representativeItem valueForProperty:MPMediaItemPropertyArtist];
    [artists addObject:artistName];
}

self.artist1 = [self partitionObjects:artists collationStringSelector:@selector(self)];

の配列を渡しているので、アーティスト名を として返すNSStringを に設定しcollationStringSelector:ます。selfNSString

于 2011-12-29T13:30:53.427 に答える