iOS复制音乐应用的字母顺序
我正在开发一个应用程序,涉及用户不得不从他们的音乐库中select一首歌曲。 当我在文档中进行研究时,我看到了媒体select器,但由于它不是以任何方式定制的,我决定最好实施我自己的音乐select器。
我遇到的问题是iOS按照字母顺序对歌曲名称进行sorting。 让我详细说一下。
当我通过MPMediaQuery获取歌曲列表时,该列表已经sorting,但不是以传统的字母顺序排列。 它使用的是一样的音乐应用程序,这是有点不同。 例如,它忽略了The和A这样的标题开头的一些词,因此“The A Team”被认为是以字母a和字母t的 “千年”开始 。 它也忽略括号等。
问题是我不知道它是如何决定先来的。 另外,如果没有自动化,这使得本地化不可能。 例如,我需要确切地知道如何做到这一点,以便我可以按部分区分歌曲。
所以,真正的问题是:有没有办法来复制这种sorting? 也许有一些方法可以将NSStrings分类到不同的类中(比如NSArray或者NSDictionary),也可以是本地化的东西,任何可以帮助我的东西。
先谢谢了
你需要使用sorting描述符来sorting数组(见下文):
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; sortedArray = [anArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
这将返回一个数组,其中所有项目都是按“真实”字母顺序排列的。 这有帮助吗?
看一下localizedCompare:
如何sorting像iTunessortingNSString?
当我尝试使用UILocalizedIndexedCollation构builduitableview索引标题时遇到同样的问题。
在某些MPMediaQuery中,itemSections / collectionSections缺失,特别是在添加了预测条件时,即使所获得的列表实际上是按照标题sorting的。 只要可用的段索引标题,就必须使用UILocalizedIndexedCollation来提取段信息。
但是,UILocalizedIndexedCollation的sorting与MPMediaQuery不同。 例如,专辑名称“A Song For You”将被分类为“A”而不是“S”。 领先的特殊字符也被忽略,如“(”,“[”,…
事实上,我可以使用UILocalizedIndexedCollation来重新构build结果数组。 但是,这是浪费资源重新sorting已经sorting的数组。 当结果很大时,UILocalizedIndexedCollation的性能是不可接受的。 更好的方法是复制iTunes的sortingalgorithm,就像你的post说的。
我设法得到以下代码工作:
+ (NSString *)transformTitleLikeiTunes:(NSString *)title { NSString *transformedTitle = title; NSRange range = [title rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]]; if ( range.length != 0 ){ transformedTitle = [title substringFromIndex:range.location]; } if ( [transformedTitle hasPrefix:@"A "] ){ return [transformedTitle substringFromIndex:2]; }else if ( [transformedTitle hasPrefix:@"The "] ){ return [transformedTitle substringFromIndex:4]; }else { return transformedTitle; } }
至less它在我的语言环境中工作。 我不知道它是否适用于其他语言,如法语,使用像“une”这样的主要文章。 也许有一种通用的方式来检测不同语言的主要文章,但我不知道它是什么。