0

エンティティTagsがあり、フェッチを実行してすべてを取得し、Tagsそれをに割り当てたいと思いNSFetchedResultsControllerます。ただし、フェッチされた結果の最初のオブジェクトをTagwithtagNameプロパティに等しくし"All"、残りをアルファベット順に並べ替えたいと思います。現在、これを行っています。これは、すべてのタグをアルファベット順に返すだけですが、名前の付いたタグ"All"を常に最初に、次に残りをアルファベット順にしたいと思います。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"Tag" inManagedObjectContext:appDelegate.managedObjectContext];

[fetchRequest setEntity:entity];
NSSortDescriptor *lastDescriptor =
[[[NSSortDescriptor alloc] initWithKey:@"tagName"ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];      

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor]];
4

2 に答える 2

2

デフォルトではなく、自分で作成したコンパレータを使用する必要があるため、次のようなことができます。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Tag" inManagedObjectContext:appDelegate.managedObjectContext];

[fetchRequest setEntity:entity];
NSSortDescriptor *lastDescriptor =
[[[NSSortDescriptor alloc] initWithKey:@"tagName" ascending:YES comparator:^NSComparisonResult(NSString* tag1, NSString* tag2) {

    if ([tag1 isEqualToString:@"All"]) return NSOrderedAscending;
    if ([tag2 isEqualToString:@"All"]) return NSOrderedDescending;

    return [tag1 compare:tag2];
}] autorelease];      

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor]];

編集

@Andrew Madsenがコンパレータを使用できると言ったように、彼がすでにあなたの質問に答えているようには見えません。

セレクターも使用できます。比較を行うためのメソッドをモデルに実装する必要があります。私が間違いを犯し、それがあなたがしていることだと信じていたことは、apple doc から:

セレクタ

オブジェクトのプロパティを比較するときに使用するメソッド (caseInsensitiveCompare: や localizedCompare: など)。セレクターは、keyPath によって識別されるプロパティの値によって実装されるメソッドを指定する必要があります。比較に使用されるセレクターには、自分自身と比較するオブジェクトである単一のパラメーターが渡され、適切な NSComparisonResult 定数を返す必要があります。セレクターには、次と同じメソッド署名が必要です: - (NSComparisonResult)localizedCompare:(NSString *)aString

于 2012-04-10T15:37:02.780 に答える
1

カスタム比較メソッドを使用して、NSSortDescriptor 自体でこれを行うことができます。ただし、取得したフェッチ リクエストの結果を並べ替えることもできます。NSArray には-sortedArrayUsingComparator:、ブロックを使用して配列をソートできるようにするメソッドがあり、このようなカスタムソート動作を非常に簡単にします。以下に例を示します。

NSArray *sortedResults = [results sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *tag1 = [obj1 tagName];
    NSString *tag2 = [obj2 tagName];

    BOOL tag1IsAll = [tag1 isEqualToString:@"All"];
    BOOL tag2IsAll = [tag2 isEqualToString:@"All"];
    if (tag1IsAll && !tag2IsAll) return NSOrderedAscending;
    if (tag2IsAll && !tag1IsAll) return NSOrderedDescending;

    return [tag1 compare:tag2];
}];
于 2012-04-10T15:27:17.080 に答える