我的班级有一个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:)];
该列按以下顺序排序:
未知操作系统
MS Windows
OSX 10.8
这是有意义的,因为0< 1<但是我要求它使用字符串对应物进行排序,这将使它成为:
MS Windows
OSX 10.8
未知的操作系统
如何在不更改枚举顺序的情况下执行此操作?
答案 0 :(得分:2)
您在选择器中使用标准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;
}
}];