ここには 2 つのオプションがあります。
1
コア データで (および拡張により、 を使用してNSFetchedResultsController
) 並べ替えたいものはすべて、何らかの方法でデータをモデル化し、並べ替え記述子を使用する必要があります。
「デフォルトの[ソート記述子]は役に立たない」と述べています(ただし説明はしません)。これは、モデルに含まれるデータでは並べ替えを行うには不十分であることを意味すると思います。この場合、問題のエンティティに新しい属性を導入する必要があります。それは大変な労力のように聞こえるかもしれませんが、多くの場合、それほど悪くはありません。
2テーブル ビューの を、フェッチされた結果コントローラから独自のスキーム (配列など) に
変更できます。datasource
もちろん、メモリへの影響はありますが、これが最も簡単な方法かもしれません。
編集
問題 (循環ベクトルの並べ替え) を言い直した後、ここに提案がありsortDescriptorWithKey:ascending:comparator:
ます。必要な結果を正確に提供する並べ替え記述子を作成するために使用できます。(警告: テストされていないコード)
int centerNumber = 2; // or whatever your method returns
NSSortDescriptor *descriptor = [NSSortDescriptor
sortDescriptorWithKey:@"number"
ascending:YES
comparator:^(int a, int b) {
NSComparisonResult r;
if (a == b) r = NSOrderedSame;
else if (a == centerNumber) r = NSOrderedAscending;
else if (b == centerNumber) r = NSOrderedDescending;
else if (abs(a-c) == abs(b-c))
if (a<b) r = NSOrderedDescending;
else r = NSOrderedAscending;
else
if (abs(a-c) > abs(b-c)) r = NSOrderedAscending;
else r = NSOrderedDescending;
return r;
}];
うまくいくかどうか教えてください。
EDIT 2
NSNumber が必要な場合 (データが保存される可能性が最も高い方法です)、おそらくこれで動作します:
...^(id x, id y) {
int a = [x intValue];
int b = [y intValue];
...
}...
最終編集
コンパレータが機能しない場合はNSComparisonResult
、結果の型として挿入します。
...comparator:^NSComparisonResult(id x, id y){....