在NSTableView中对动态创建的数据进行排序。

问题描述 投票:0回答:1

我有一个包含多个列的NSTableView,每一个列都被我设置为可排序,通过将列的排序键映射到我的模型中的一个属性,并提供一个比较:选择器。这对于那些直接映射到我的模型中的NSString或NSInteger属性的列来说是完美的。

然而,我有几个列,实际上是模型数据的集合--即我的objectValueForTableColumn方法将挖掘到模型,并经常使用两个或更多的属性来生成适当的NSString来显示在该rowcolumn中。

我一直在尝试让这些列进行排序,但我不确定排序键或选择器的内容。我试过使用其中一个属性名,试过使用compare:,等等......但代码要么什么都不做,要么生成一个异常。

我阅读了苹果公司关于NSTableView排序的文档,并在网上搜索了一些例子,但并不完全清楚应该如何处理这种情况。如何将这些列映射到一个键上,如何进行比较。如前所述,表中显示的数据是一个字符串,似乎可以通过compare:进行排序,还是有什么机制可以提供一个自定义的比较函数?

谢谢!我有一个NSTableView,这个NSTableView可以通过compare:进行排序,或者有什么机制可以提供自定义的比较函数?

objective-c macos sorting cocoa nstableview
1个回答
0
投票

Cocoa提供了内置的排序描述符,但这些描述符只能处理基本的数据类型:字符串、日期、数字。在你的情况下,你需要定义一个自定义的排序描述符,并将其传递给表--你的数据模型不是一个简单的数据类型。排序描述符所做的就是取两个值,并报告值1是否大于值2,小于,或者它们是否相等。它看起来会是这样的。

- (NSSortDescriptor*)myCustomSortDescriptor
{
    if (_myCustomSortDescriptor == nil) {
        NSComparisonResult (^myModelSortBlock)(id, id) = ^NSComparisonResult(id obj1, id obj2) {
            //
            // Here you have two objects from your model, i.e. the
            // the two rows that NSTableView wants to check the order of.
            // This is where your custom comparison goes. Then you return one of:
            // 
            if (obj1 < obj2)
                return NSOrderedAscending;
            else if (obj1 > obj2)
                return NSOrderedDescending;
            else
                return NSOrderedSame; // they must be the same
        };
        _myCustomSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self"
                                                                ascending:YES
                                                               comparator:myModelSortBlock];
    }
    return _myCustomSortDescriptor;
}

为了方便起见,我把它打包在一个方法中, 但你可以在任何地方定义它。然后你把你的自定义排序描述符传给表。

© www.soinside.com 2019 - 2024. All rights reserved.