以下代码用于分区并将部分添加到歌曲列表中。
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"
有人可以帮我吗?我准备撕掉我的头发了!
感谢您!
奔奔
答案 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
返回。