NSArrayController 如何对一对多关系进行排序?

Posted

技术标签:

【中文标题】NSArrayController 如何对一对多关系进行排序?【英文标题】:How can NSArrayController sort on a to-many relationship? 【发布时间】:2011-12-01 14:25:02 【问题描述】:

使用 CoreData,我有一个实体“书签”,它与另一个实体“标签”有一个名为“标签”的一对多关系,以及一些公共属性(字符串、日期、...)。

在 NSTableView 中,我们通过 Binding 显示 Bookmarks 实体:

NSArrayController 绑定到文件的 Owner.managedObjectContext (标准 XCode CoreData 模板,managedObjectContext 在 AppDelegate 中) TableView 中的列绑定到它们各自的属性。特别是 Tag 列通过 NSValueTransformer 的子类绑定到这个 arrayController.arrangedObjects.tags ,这样我们就可以以 NSString 的形式显示一对多关系的摘要。

它工作。现在,当我单击列标题时,整个表格视图都会正确排序,除了我得到这个的“标签”列:

-[_NSFaultingMutableSet compare:]: unrecognized selector sent to instance

确保这种对多关系中的“设置”不会响应选择器“比较:”。

问题: 我怎样才能使这项工作?如何对一对多关系进行排序?

有类似 ValueTransformer 的东西吗?如果我可以提供一个自定义类来进行比较:让 ArrayController 知道...

【问题讨论】:

ios 5 和 Mac OS X 10.7 中,我们订购了多对多关系。它不使用 NSSet,而是使用 NSOrderedSet。唉,它需要最新版本(我在 10.6 上运行)。除此之外,我在另一台机器上尝试了 10.7,但我无法在几个小时内使其正常运行...... 【参考方案1】:

一种可能的技巧:由于 _NSFaultingMutableSet 是一个 NSSet,我们可以通过类别添加选择器“比较:”。

@interface NSSet (someAdditions)
   - (NSComparisonResult)compare:(NSSet *)anotherSet;
@end

@implementation NSSet (someAdditions)
   - (NSComparisonResult)compare:(NSSet *)aSet 
      ...  
   
@end

我们现在可以按照我们的意愿实现这个 compare: 选择器,比如比较每个集合的计数,或者以某种方式比较它们的 NSString 表示。

它在我的应用程序中工作。我重新启用了 NSTableColumn 绑定上的“创建排序描述符”,现在可以单击我的 tableView 的标题进行排序。

这是一个 hack,因为它会影响所有 NSSet……但至少我有我的钩子。

你怎么看?

【讨论】:

以上是关于NSArrayController 如何对一对多关系进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

将表示一对多关系的 NSSet 绑定到 NSArrayController 的选择

tableCellView 内的 NSButton:如何对基于视图的 NSTableView/NSArrayController 使用“动作调用”

延迟获取和维护排序的 NSArrayController

将 NSArray 与 NSArrayController 绑定并在 NSTableView 中显示结果

对支持 CoreData 的 NSArrayController 进行排序时遇到问题

如何将 NSArrayController 的内容集绑定到多个 NSArrayController 选择?