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を使用してアルファベットを正しく生成し、UILocalizedIndexCollat​​ion に基づく正しい並べ替え方法を使用して並べ替える方法を示します。私の質問は、これを行うためのより良い方法を求めることを中心に展開しています。

UILocalizedIndexCollat​​ion を使用しない場合は、localizedStandardCompare のみを使用する必要があります。ローカリゼーションの WWDC ビデオで説明されているように、localizedCompare ではありません。

于 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」は、文字列型の属性「name」を 1 つ持つ Core Data エンティティです。

于 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 に答える