UILocalizedIndexedCollat​​ion - MPMediaQuery

时间:2011-11-20 11:14:16

标签: ios ios4 mpmediaitem ios5 mpmediaquery

以下代码用于分区并将部分添加到歌曲列表中。

    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错误。我把它归结为代码的“集合”部分,因为这是整个块的唯一区别。我已经尝试将“标题”更改为“名称”“albumTitle”,“播放列表”,“流派”等等,但我仍然最终:

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

有人可以帮我吗?我准备撕掉我的头发了!

感谢您!

奔奔

1 个答案:

答案 0 :(得分: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:设置为self,这会将艺术家名称作为NSString返回。