当第一个字母一起排序时,从NSFetchedResultsController获取单个部分

时间:2014-05-04 11:19:08

标签: ios core-data nsfetchedresultscontroller

我将NSFetchRequests's sortDescriptor设置为只包含一个NSSortDescriptor的数组:

[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES
                  selector:@selector(localizedCaseInsensitiveCompare:)]

然后,我创建了一个NSFetchResultsController,其@"name"也是sectionKeyNamePath

当语言环境为英语时,带有变音符号的字母与其普通字母一起排序。例如,出于分类的目的,“Å”被视为“A”。问题是,当获取结果被分解为多个部分时,不会考虑这一点,因此每次结果序列从“A”变为“Å”或反之时,都会添加一个新的部分。因此,NSFetchResultsController's sectionIndexTitles返回一个数组

("\U00c5", A, "\U00c5", A, "\U00c5", A, B, C, …)

并且我的UITableView

中的部分索引标题如下所示

Section index titles

问题:我怎样才能使用以字母排序的名称只生成一个部分呢?

从用于排序的基础数据中删除变音符号不是一种选择,因为其他一些语言环境将“A”和“Å”视为单独的字母,“Å”在字母表中的“Z”之后排序。

带有自定义比较器的NSSortDescriptor不是一个选项,因为Core Data只能使用一组固定的内置比较器。 (这是因为它们被转换为基础数据库的SQL。)

1 个答案:

答案 0 :(得分:0)

SO question and answer可能会占据关键......

[NSSortDescriptor sortDescriptorWithKey:@"name" 
                              ascending:YES
                             comparator:(NSComparator)^(NSString *key1, NSString *key2) {
    return [key1 compare:key2 
                 options:NSDiacriticInsensitiveSearch | NSCaseInsensitiveSearch];    
}];

虽然我无法测试这台ATM,但从理论上说这应该可行。

比较器应该遍历sortDescriptorWithKey:@"name"并将每一个与另一个进行比较,以返回一组包含大小写和变音符号不敏感的字母。

希望这有帮助。