使用转换后的值对 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 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

核心数据、NSTableColumn 绑定和自定义 NSCell

将前端传递来的键值对转换成对象相应的值

如何使用优先队列根据键值对的值进行排序

如何根据相同的值对数组进行分组

如何将字符串空格分隔的键,唯一字的值对转换为字典

使用内部对象的实例变量的值对自定义对象数组进行排序