2011-12-01 44 views
0

使用CoreData,我有一个实体“Bookmark”,它具有一个名为'tags'到另一个实体“Tag”的一对多关系,以及一些通信属性(string,date,...)。NSArrayController如何排序一对多的关系?

在NSTableView的,我们通过结合显示书签实体:

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

它的工作。现在,当我点击列标题整个表视图得到正确排序,除了“标签”栏在那里我得到这个:

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

可以肯定的“设置”,从这个一对多的关系不回应选择器'比较:'。

问题: 我怎样才能使这项工作?我如何分类一对多关系?

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

+0

在iOS 5和Mac OS X 10.7中,我们订购了多对多关系。它使用NSOrderedSet而不是使用NSSet。唉它需要最新版本(我在10.6上运行)。除此之外,我在另一台机器上尝试过10.7,并且几个小时后我无法使其正常工作...... – malaba

回答

0

一个可能的破解:因为_NSFaultingMutableSet是一个NSSet,我们可以通过一个分类来添加选择器'compare:'。

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

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

我们现在可以实现这个比较:选择如我们所愿,就像比较每一组,或以某种方式他们的NSString表示的计数。

它在我的应用程序中工作。我在NSTableColumn的绑定上重新启用了'Creates Sort Descriptor',现在可以点击我的tableView的标题进行排序。

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

您认为如何?