以下代码用于对歌曲列表进行分区和添加部分。
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 错误。我将其归因于代码的“集合”部分,因为这是整个 block 中唯一的区别。我试过将“标题”更改为“名称”、“专辑标题”、“播放列表”、“流派”等等,但我仍然以:
"-[MPConcreteMediaItemCollection title]: unrecognized selector sent to instance"
有人可以帮我吗?我准备好扯掉我的头发了!
谢谢!
奔奔
最佳答案
您是对的,问题出在集合部分。 collationStringSelector:
必须是一种方法,它为您传递给它的对象返回一个 NSString
,在本例中为 MPMediaItemCollection
。
(它在第一种情况下有效,因为您传递的是 MPMediaItem
,它确实响应 title
)。
在这里,我们从 artistCollections
数组中选择每个 MPMediaItemCollection
,然后获得代表整个集合的单个 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
.
关于ios - UILocalizedIndexedCollation - MPMediaQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8201133/