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

时间:2011-12-01 14:25:02

标签: cocoa core-data cocoa-bindings nsarraycontroller

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

在NSTableView中,我们通过Binding:

显示Bookmarks实体
  • NSArrayController绑定到File的Owner.managedObjectContext (标准XCode CoreData模板,managedObjectContext在AppDelegate中)
  • TableView中的列绑定到各自的属性。特别是Tag列绑定到带有NSValueTransformer子类的arrayController.arrangedObjects.tags,以便我们可以作为NSString显示to-many关系的摘要。

有效。现在,当我点击列标题时,整个表格视图的排序正确,除了“标记”列,我得到了这个:

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

当然,从这个多对多关系中的“设置”不会响应选择器'compare:'。

问题: 我怎样才能做到这一点?我怎样才能对多对多关系进行排序?

是否可以使用ValueTransformer?如果我可以提供一个可以进行比较的自定义类:让ArrayController知道......

1 个答案:

答案 0 :(得分:0)

一种可能的黑客攻击:由于_NSFaultingMutableSet是一个NSSet,我们可以通过类别添加选择器'compare:'。

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

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

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

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

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

您怎么看?