代码使用部分工作并填充表格,但它有一个缺陷:它不会逃避标点符号和歌曲标题中的''前缀,就像本机音乐应用程序一样。
非常感谢我应该如何做到这一点。
- (void)viewDidLoad
{
[super viewDidLoad];
MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
self.songsArray = [songQuery items];
self.sectionedSongsArray = [self partitionObjects:self.songsArray collationStringSelector:@selector(title)];
}
- (NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector
{
UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];
NSInteger sectionCount = [[collation sectionTitles] count];
NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];
for(int i = 0; i < sectionCount; i++)
{
[unsortedSections addObject:[NSMutableArray array]];
}
for (id object in array)
{
NSInteger index = [collation sectionForObject:object collationStringSelector:selector];
[[unsortedSections objectAtIndex:index] addObject:object];
}
NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount];
for (NSMutableArray *section in unsortedSections)
{
[sections addObject:[collation sortedArrayFromArray:section collationStringSelector:selector]];
}
return sections;
}
答案 0 :(得分:5)
我完全忽视了这一点。这里的答案是简单地使用MPMediaQuerySection
。 Apple文档是有原因的!
答案 1 :(得分:2)
Cocotutch -
以下是我用来索引包含音乐库中所有歌曲的查询的实现:
MPMediaQuery *allSongsQuery = [MPMediaQuery songsQuery];
// Fill in the all songs array with all the songs in the user's media library
allSongsArray = [allSongsQuery items];
allSongsArraySections = [allSongsQuery itemSections];
allSongsArraySections是MPMediaQuerySection的NSArray,每个都有标题和范围。第0部分的NSArray对象(在我的例子中带有标题@“A”)的range.location为0,range.length为158.
当为我的UITableView调用numberOfRowsInSection时,我返回每个部分的range.length值。我使用cellForRowAtIndexPath中的range.location值作为该节的起始行,然后将indexPath.row添加到它,以便到达我需要从allSongsArray返回的单元格。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
....
// Return the number of rows in the section.
MPMediaQuerySection *allSongsArraySection = globalMusicPlayerPtr.allSongsArraySections[section];
return allSongsArraySection.range.length;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
MPMediaQuerySection *allSongsArraySection = globalMusicPlayerPtr.allSongsArraySections[indexPath.section];
rowItem = [globalMusicPlayerPtr.allSongsArray objectAtIndex:allSongsArraySection.range.location + indexPath.row];
....
}
在使用之前,我试图通过编写自己的实现来匹配本机音乐播放器的实现,并且它的行为并不完全相同。不仅如此,原生索引还要快得多!