我有一个包含多个列的NSTableView,每一个列都被我设置为可排序,通过将列的排序键映射到我的模型中的一个属性,并提供一个比较:选择器。这对于那些直接映射到我的模型中的NSString或NSInteger属性的列来说是完美的。
然而,我有几个列,实际上是模型数据的集合--即我的objectValueForTableColumn方法将挖掘到模型,并经常使用两个或更多的属性来生成适当的NSString来显示在该rowcolumn中。
我一直在尝试让这些列进行排序,但我不确定排序键或选择器的内容。我试过使用其中一个属性名,试过使用compare:,等等......但代码要么什么都不做,要么生成一个异常。
我阅读了苹果公司关于NSTableView排序的文档,并在网上搜索了一些例子,但并不完全清楚应该如何处理这种情况。如何将这些列映射到一个键上,如何进行比较。如前所述,表中显示的数据是一个字符串,似乎可以通过compare:进行排序,还是有什么机制可以提供一个自定义的比较函数?
谢谢!我有一个NSTableView,这个NSTableView可以通过compare:进行排序,或者有什么机制可以提供自定义的比较函数?
Cocoa提供了内置的排序描述符,但这些描述符只能处理基本的数据类型:字符串、日期、数字。在你的情况下,你需要定义一个自定义的排序描述符,并将其传递给表--你的数据模型不是一个简单的数据类型。排序描述符所做的就是取两个值,并报告值1是否大于值2,小于,或者它们是否相等。它看起来会是这样的。
- (NSSortDescriptor*)myCustomSortDescriptor
{
if (_myCustomSortDescriptor == nil) {
NSComparisonResult (^myModelSortBlock)(id, id) = ^NSComparisonResult(id obj1, id obj2) {
//
// Here you have two objects from your model, i.e. the
// the two rows that NSTableView wants to check the order of.
// This is where your custom comparison goes. Then you return one of:
//
if (obj1 < obj2)
return NSOrderedAscending;
else if (obj1 > obj2)
return NSOrderedDescending;
else
return NSOrderedSame; // they must be the same
};
_myCustomSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self"
ascending:YES
comparator:myModelSortBlock];
}
return _myCustomSortDescriptor;
}
为了方便起见,我把它打包在一个方法中, 但你可以在任何地方定义它。然后你把你的自定义排序描述符传给表。