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:必须是为您传递的对象返回 a 的方法,NSString在这种情况下 MPMediaItemCollection是 's.

(它在第一种情况下有效,因为您传递的是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's 数组,因此我们将其设置collationStringSelector:self将返回艺术家姓名的NSString.

于 2011-12-29T13:30:53.427 回答