0

ソート記述子を使用せずにコア データを使用するテーブル ビューのセクションを再配置する方法はありますか?
必要な並べ替えの種類はアルファベット順ではなく、時間によって異なります (Core Data を使用すると、並べ替え記述子にカスタム セレクターを使用できないため、デフォルトのセレクターは役に立たないことを読みました)。

「セクションの並べ替え」が発生する必要があるときに呼び出されるメソッドがあり、変更できる「インデックス ベクトル」があるのではないかと考えているため、セクションはそのインデックスまたは同様のもので並べ替えられます。
助けてくれてありがとう!

4

1 に答える 1

1

ここには 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){....
于 2012-05-19T18:49:16.653 に答える