使用转换后的值对 NSTableColumn 进行排序
Posted
技术标签:
【中文标题】使用转换后的值对 NSTableColumn 进行排序【英文标题】:Sorting an NSTableColumn using transformed values 【发布时间】:2013-05-14 18:40:36 【问题描述】:我的班级有一个属性是enum
。此属性绑定到NSTableColumn
。
typedef enum _Status
Unknown=0,
Win,
OSX
Status;
为了确保NSTableColumn
显示正确的字符串表示,而不是显示数字0、1 和2,我使用NSValueTransformer
。
所以Unknown
变成了“未知操作系统”。 Win
变成“MS Windows”,OSX
变成“OSX 10.8”。表格列正确显示了这些值。
我需要使用转换后的值对列进行排序。如果我使用
[NSSortDescriptor sortDescriptorWithKey:@"status"
ascending:YES
selector:@selector(compare:)];
该列按以下顺序排序:
未知操作系统 微软视窗 OSX 10.8
这确实有意义,因为 0
微软视窗 OSX 10.8 未知操作系统
如何在不改变枚举顺序的情况下做到这一点?
【问题讨论】:
【参考方案1】:您在选择器中使用标准的compare:
方法。它只是比较枚举。创建您自己的方法来比较您想要的方式。它可以调用你的 NSValueTransformer 来获取字符串值,然后你比较它们,并返回适当的 NSComparisonResult。
[编辑] 好的,我的第一个建议不会很容易(不使用类别)。但是这样的事情应该。假设 myValueTransformer 已经实例化,并且你的状态是一个 NSNumber:
sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"status" ascending: YES
comparator:^(id first, id second)
NSNumber* firstNum = (NSNumber*)first;
NSNumber* secondNum = (NSNumber*)second;
if ([myValueTransformer transformedValue:firstNum] == [myValueTransformer transformedValue:secondNum])
return NSOrderedSame;
else if ([myValueTransformer transformedValue:firstNum] > [myValueTransformer transformedValue:secondNum])
return NSOrderedDescending;
else
return NSOrderedAscending;
];
【讨论】:
来自文档“选择器必须指定由 keyPath 标识的属性值实现的方法。”所以这意味着我的排序描述符将变为[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compareStatus:)]
。我说的对吗?
好吧,我的错。你可能不想那样做。但是您可以使用基于块的比较器来做到这一点。请参阅上面的编辑。以上是关于使用转换后的值对 NSTableColumn 进行排序的主要内容,如果未能解决你的问题,请参考以下文章