【问题标题】:UILocalizedIndexedCollation - MPMediaQueryUILocalizedIndexedCollat​​ion - MPMediaQuery
【发布时间】:2011-11-20 11:14:15
【问题描述】:

以下代码用于对歌曲列表进行分区和添加部分。

    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"

有人可以帮我吗?我已经准备好扯掉我的头发了!

谢谢!

奔奔

【问题讨论】:

  • 鉴于下面的答案,您如何处理有两首同名歌曲并且您分区的所有内容都是NSStrings的数组(每行中您拥有的唯一信息/部分)?
  • 这个比较老了。这个问题已经得到了很好的解决,虽然我不明白你的问题?你的意思是我如何使用这种分区方法管理选择?
  • 是的,例如,如果你要列出专辑集合,你如何处理有两个同名专辑(不同艺术家)的情况,你只有专辑可供参考名称存储在NSStrings 的数组中?
  • 应该没什么区别。完全不影响我的应用程序。如果您需要更多帮助,请在 Twitter 上私信我 :) @cocotutch
  • sooper 只是谓词过滤专辑名称。

标签: ios ios4 mpmediaitem ios5 mpmediaquery


【解决方案1】:

您说得对,问题出在集合部分。 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

【讨论】:

  • 我这样做了,但它在每个单元格中都显示“未知专辑”?
  • 刚刚注意到您似乎想要列出特定艺术家的所有专辑。在这种情况下,将 MPMediaItemPropertyArtist 更改为 MPMediaItemPropertyAlbumTitle。由于查询是按专辑分组并通过谓词限制到特定艺​​术家,因此集合中每个组的representativeItem 是专辑而不是艺术家。
  • 我更改了代码以适应我的需要,谢谢。仍然在单元格中显示“未知专辑”...我可能需要检查我的 CellForIndexRow 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多