我正在尝试为 NSTableView 中的列实现自定义排序。此列的数据在自定义对象内包含双精度值,其中一些值为正,一些为负,一些为“不适用”(即该行无关紧要,应排序到底部)。
我在表视图中创建了一个比较方法,如下所示...
- (NSComparisonResult) myCompare:(id) obj1 : (id) obj2 {
if (obj1 < obj2)
return NSOrderedAscending;
else if (obj1 > obj2)
return NSOrderedDescending;
else
return NSOrderedSame; // they must be the same
};
...obj1 和 obj2 的比较实际上深入到了被比较对象的数据。
在我的故事板中,该列的排序键是:myObject
该列的选择器是:myCompare:
运行代码并单击我希望对结果进行排序的列:
线程 1:“-[__NSCFNumber myCompare:]:无法识别的选择器发送到实例 0x600003824740”
显然,事情的设置不太正确。我对 viewWillAppear 方法进行了一些更改以设置排序描述符,但出现了相同的错误。 如何让我的表视图识别并调用自定义排序例程?
我找出了问题所在,这与我的自定义比较方法有关,而不是我在故事板中所做的任何事情或设置排序描述符。 Apple 的表视图编程指南详细介绍了比较选择器,指出“此比较选择器需要一个参数”(Mac 的表视图编程指南),我一直期待一种采用一对参数(例如排序)的方法一个 NSArray。 正确的自定义比较方法位于将进行比较的自定义对象中,如下所示:
- (NSComparisonResult) myCompare:(id) obj {
myObject *objToCompare = (myObject *) obj;
if (objToCompare.value < value)
return NSOrderedAscending;
else if (objToCompare.value > value)
return NSOrderedDescending;
else
return NSOrderedSame; // they must be the same
};