アイテムのリストを表示するスクロールビューを備えた Mac アプリがあります。項目のデータは Core Data から提供されています。スクロール ビュー内の項目の順序をランダム化する「シャッフル」ボタンを用意する必要があります。
1 に答える
バインディングを使用している場合、選択肢は 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]];
バインディングを使用する場合は、通常のソート記述子を使用する場合にランダム化ソート記述子を使用するだけで、有効にランダム化されたものを取得できます。