使用转换值对NSTableColumn进行排序

时间:2013-05-14 18:40:36

标签: objective-c macos cocoa nsvaluetransformer

我的班级有一个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
未知的操作系统

如何在不更改枚举顺序的情况下执行此操作?

1 个答案:

答案 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;
    }
}];