5

我正在使用排序描述符对获取请求的结果进行排序。

NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:[MyEntity entityName]];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"property" 
                                                           ascending:YES 
                                                            selector:@selector(localizedCompare:)];
req.sortDescriptors = [NSArray arrayWithObject:descriptor];
return [self.managedObjectContext executeFetchRequest:req error:nil];

问题在于以“İ”等非英语字符开头的单词列在列表末尾。这是一个土耳其字母,字母表如下所示:

A、B、C、Ç、D、E、F、G、Ğ、H、I、İ、J、K、L、M、N、O、Ö、P、R、S、Ş、T、U、 Ü、V、Y、Z。

所以这封信在第 12 位。

我不知道为什么,但在获取对象后使用比较器是可行的。所以它适用于任何数组,但不适用于获取请求的排序描述符。

4

3 回答 3

3

在NSFetchedResultsController vs UILocalizedIndexedCollat​​ion中查看我的问题的详细信息,我将展示如何使用 UILocalizedIndexedCollat​​ion 正确生成 Alphabet 并使用基于 UILocalizedIndexCollat​​ion 的正确排序方法进行排序。我的问题只是围绕着寻求更好的方法来做到这一点。

如果您不使用 UILocalizedIndexCollat​​ion,您应该只使用 WWDC 视频中提到的 localizedStandardCompare: notlocalizedCompare 进行本地化。

于 2012-08-06T03:00:17.393 回答
1

尝试

[NSSortDescriptor alloc] initWithKey:@"property" ascending:YES selector:@selector(localizedCompare:)]

编辑

@Mert 更新了他的问题。现在似乎localizedCompare:正确地对土耳其字母进行了排序,但不适用于获取请求。

这是我为测试此问题所做的工作。也许您可以检查它是否适用于您的环境,然后从那里开始工作:

// Create some entities:
NSArray *a = @[@"İ", @"J", @"Ğ", @"G", @"H", @"I", @"Ç", @"C"];
for (NSString *s in a) {
    MyEntity *e = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity"
                                                inManagedObjectContext:self.managedObjectContext];
    e.name = s;
}

// Fetch all entities in sorted order:
NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                           ascending:YES
                                                            selector:@selector(localizedCompare:)];
req.sortDescriptors = [NSArray arrayWithObject:descriptor];
NSArray *result = [self.managedObjectContext executeFetchRequest:req error:nil];

“MyEntity”是一个核心数据实体,具有一个字符串类型的属性“名称”。

于 2012-08-05T07:10:37.983 回答
0

我遇到了类似的问题:

[strArr sortedArrayUsingSelector:@selector(localizedCompare:)]

看起来

localizedCompare

来电

compare:other options:nil range:NSMakeRange(0, self.length) locale: [NSLocale currentLocale]];

[NSLocale currentLocale]根据用户的喜好,可能处于混合状态。因此需要NSLocale根据用户的语言创建一个干净的

NSString尝试使用以下内容创建一个类别:

-(NSComparisonResult)currentLocalCompare:(id)other
{
    NSLocale * currLoc = [NSLocale currentLocale]; //get current locale
    NSLocale * loc = [[NSLocale alloc] initWithLocaleIdentifier:currLoc.localeIdentifier];//lets create a new clean NSLocale based on users prefared langauge
    return [self compare:other options:nil range:NSMakeRange(0, self.length) locale:loc];//compare using clean NSLocale
}

并称之为:

[strArr sortedArrayUsingSelector:@selector(currentLocalCompare:)]

于 2013-04-30T11:53:21.170 回答