【问题标题】:How can NSArrayController sort on a to-many relationship?NSArrayController 如何对一对多关系进行排序?
【发布时间】: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,但我无法在几个小时内使其正常运行......

标签: cocoa core-data cocoa-bindings nsarraycontroller


【解决方案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……但至少我有我的钩子。

你怎么看?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2018-11-20
    相关资源
    最近更新 更多