有什么方法可以在不使用排序描述符的情况下重新排列使用核心数据的表视图的部分?
我需要的那种排序不是按字母顺序排列的,它会随时间变化(我已经读过,使用 Core Data,你不能使用自定义选择器作为排序描述符,所以默认选择器对我没有帮助)。
我有一个方法,当“部分重新排序”应该发生时被调用,我想知道是否有某种“索引向量”我可以修改,所以这些部分由该索引或类似的东西排序。
谢谢您的帮助!
有什么方法可以在不使用排序描述符的情况下重新排列使用核心数据的表视图的部分?
我需要的那种排序不是按字母顺序排列的,它会随时间变化(我已经读过,使用 Core Data,你不能使用自定义选择器作为排序描述符,所以默认选择器对我没有帮助)。
我有一个方法,当“部分重新排序”应该发生时被调用,我想知道是否有某种“索引向量”我可以修改,所以这些部分由该索引或类似的东西排序。
谢谢您的帮助!
您在这里有两个选择:
1
您想要在核心数据中排序的任何内容(并且,通过扩展,使用 a 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){....