2

我的班级有一个属性是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 < 2。但我要求它使用它们的字符串对应物进行排序,这将使它:

MS Windows
OSX 10.8
未知操作系统

如何在不更改枚举顺序的情况下做到这一点?

4

1 回答 1

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;
    }
}];
于 2013-05-14T18:49:10.527 回答