3

アイテムのリストを表示するスクロールビューを備えた Mac アプリがあります。項目のデータは Core Data から提供されています。スクロール ビュー内の項目の順序をランダム化する「シャッフル」ボタンを用意する必要があります。

4

1 に答える 1

3

バインディングを使用している場合、選択肢は 2 つしかありません。(1) ソートされた配列を返すキーを持つカスタム オブジェクトにバインドするか、(2) 順序付けの代わりにランダム化するソート記述子を使用します。

状況によっては、2 番目のオプションの方が簡単です。ランダム化ソート記述子を生成するには、(1) NSSortDescriptor サブクラスを作成してオーバーライドします。compareObject:toObject:

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2{
  NSUInteger ran=(arc4random() % 3);
  switch (ran) {
    case 0:
      return NSOrderedSame;
      break;
    case 1:
      return NSOrderedDescending;
    default:
      return NSOrderedAscending;
      break;
  }  
}

または(2)同じ方法でランダムな順序を提供するセレクターまたはブロックを提供します。

  NSSortDescriptor *rs=[NSSortDescriptor sortDescriptorWithKey:@"intValue" 
                                                    ascending:YES
                                                   comparator:^(id obj1, id obj2){
                                                     NSUInteger ran=(arc4random() % 3);
                                                     switch (ran) {
                                                       case 0:
                                                         return NSOrderedSame;
                                                         break;
                                                       case 1:
                                                         return NSOrderedDescending;
                                                       default:
                                                         return NSOrderedAscending;
                                                         break;
                                                     }
                                                   }];

(2) の欠点は、並べ替え対象のオブジェクトが理解できるキーを提供する必要があることです。たとえば、上記では、NSNumber オブジェクトの配列を並べ替えたのでintValue、NSNumber が応答するキーを提供する必要があります。サブクラス メソッドはキーをあまり気にしません。

ただし、並べ替えを使用すると、ランダム化がめちゃくちゃな並べ替えであるため、弱いランダム化された配列しか返されません。つまり、ほとんどの要素は配列内であまり移動しません。よりランダム化された効果を作成するには、ランダム化ソートを配列にスタックして、配列に対して複数のパスを作成します。例:

[ aMutableArray sortUsingDescriptors:[NSArray arrayWithObjects:rs,rs,rs, nil]];

バインディングを使用する場合は、通常のソート記述子を使用する場合にランダム化ソート記述子を使用するだけで、有効にランダム化されたものを取得できます。

于 2011-03-31T20:10:32.373 に答える