【发布时间】:2014-08-27 11:33:16
【问题描述】:
我是 Objective C 和 iOS 编程的新手,并且已经进入了一些让我头疼的领域。任何帮助表示赞赏。
我在对要在 UITableView 中使用的数组进行排序时遇到问题。基本上,我想查询一组专辑,并根据用户设置按字母顺序或日期(升序和降序)排序。首先我合成了一些全局数组,然后对专辑进行媒体查询:
@synthesize allSongs, arrayForTableView;
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
[songsQuery setGroupingType: MPMediaGroupingAlbum];
arrayForTableView = [songsQuery collections];
allSongs = [songsQuery items];
到目前为止,一切都很好。专辑按字母顺序排序,就像它们应该的那样。 allSongs 数组用于其他地方的一些播放功能。所以现在,我添加了设置检测,以及按“年份”属性排序:
@synthesize allSongs, arrayForTableView;
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery];
[songsQuery setGroupingType: MPMediaGroupingAlbum];
NSArray *allAlbums = [songsQuery collections];
allSongs = [songsQuery items];
if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"SortAlbumsMethod"] isEqualToString:@"0"]) {
arrayForTableView = [songsQuery collections];
} else if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"SortAlbumsMethod"] isEqualToString:@"1"]) {
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
arrayForTableView = [allAlbums sortedArrayUsingDescriptors:sortDescriptors];
} else {
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year"
ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
arrayForTableView = [allAlbums sortedArrayUsingDescriptors:sortDescriptors];
}
这是我遇到问题的地方。上述方法不起作用,因为每个集合(专辑)都没有 year 属性。如果我将“allAlbums”替换为“allSongs”,则代码运行正常。 除了我现在每首歌都有一个条目。显示的标签信息仅与专辑相关,并且导航基于 AlbumPersistentID,所以一切正常,我只是有太多重复条目(看起来相同,因为未显示歌曲名称)。
似乎显而易见的解决方案是创建一个数组,让我们将其称为“albumRepresentatives”,其中包含“allAlbums”中每个集合中的单个项目,并在排序描述符中使用它。每个项目实际上都是一首歌而不是专辑,但外观和功能仍然可以工作。理想情况下,我想比较每张专辑中的所有歌曲,选择具有最高“年份”属性的歌曲并将其添加到“albumRepresentatives”。 B 计划是简单地将歌曲放在索引 0 的每个专辑集合中。
问题是实际上做这超出了我的能力范围。任何帮助将不胜感激!
【问题讨论】: