【问题标题】:Sorting an NSTableColumn using transformed values使用转换后的值对 NSTableColumn 进行排序
【发布时间】: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
未知操作系统

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

【问题讨论】:

    标签: objective-c macos cocoa nsvaluetransformer


    【解决方案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:)]。我说的对吗?
    • 好吧,我的错。你可能不想那样做。但是您可以使用基于块的比较器来做到这一点。请参阅上面的编辑。
    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2013-04-20
    相关资源
    最近更新 更多