我有一个带有显示项目列表的滚动视图的 mac 应用程序。这些项目的数据由 Core Data 提供。我需要提供一个“随机播放”按钮,用于随机化滚动视图中项目的顺序。
问问题
1695 次
1 回答
3
如果您使用绑定,则只有两种选择:(1) 绑定到具有返回排序数组的键的自定义对象或 (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 回答