gpt4 book ai didi

objective-c - 对 NSTableView 中动态创建的数据进行排序

转载 作者:行者123 更新时间:2023-12-03 18:07:35 24 4
gpt4 key购买 nike

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

但是,我有几列实际上是模型数据的聚合 - 即我的 objectValueForTableColumn 方法将深入模型并经常使用两个或多个属性来生成要在该行/列中显示的适当 NSString .

我一直在尝试对这些列进行排序,但我不确定排序键或选择器中的内容。我尝试过使用其中一个属性名称,尝试使用 Compare: 等...但代码要么不执行任何操作,要么生成异常。

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

谢谢!

最佳答案

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;
}

为了方便起见,我将其封装在一个方法中,但您可以在任何您想要的地方定义它。然后,您将自定义排序描述符传递到表中。

关于objective-c - 对 NSTableView 中动态创建的数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61262042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com