使用核心数据时如何重新排列部分

时间:2012-05-19 18:09:45

标签: objective-c uitableview sorting core-data

有没有什么方法可以重新排列使用核心数据的表格视图的各个部分,而不使用排序描述符?
我需要的那种排序不是按字母顺序排列的,它会随时间变化(我已经读过,使用Core Data,你不能使用自定义选择器作为排序描述符,所以默认选择器对我没有帮助)。

我有一个方法,当一个“部分重新排序”应该发生时被调用,我想知道是否有某种“索引向量”我可以修改,所以这些部分按索引排序,或类似的东西。 /> 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

这里有两个选项:

<强> 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;
}];

让我知道它是否有效。

编辑2
如果您需要NSNumber(最有可能存储数据的方式),可能这样做:

...^(id x, id y) {
   int a = [x intValue];
   int b = [y intValue];
   ...
}...

最终修改

如果比较器不起作用,请插入NSComparisonResult作为结果类型:

...comparator:^NSComparisonResult(id x, id y){....