3

我有一个带有显示项目列表的滚动视图的 mac 应用程序。这些项目的数据由 Core Data 提供。我需要提供一个“随机播放”按钮,用于随机化滚动视图中项目的顺序。

4

1 回答 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 对象数组进行了排序,所以我必须提供一个intValueNSNumber 响应的键。子类方法并不真正关心键。

然而,使用排序只返回一个弱随机化数组,因为随机化只是一个混乱的排序,即大多数元素在数组中不会移动很远。要创建更随机的效果,请将随机排序堆叠到一个数组中,以便它们在数组上进行多次传递,例如:

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

如果您使用绑定,只需在使用普通排序描述符的地方使用随机排序描述符,您应该会得到有用的随机排序描述符。

于 2011-03-31T20:10:32.373 回答