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

发布于 2024-12-19 04:08:33 字数 744 浏览 4 评论 0原文

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

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

  • NSArrayController 绑定到 File 的 Owner.managedObjectContext (标准 XCode CoreData 模板, ManagedObjectContext 位于 AppDelegate 中)
  • TableView 中的列绑定到它们各自的属性。特别是,Tag 列通过 NSValueTransformer 的子类绑定到 arrayController.arrangedObjects.tags,以便我们可以将一对多关系的摘要显示为 NSString。

它起作用了。现在,当我单击列标题时,整个表视图都会正确排序,除了“标记”列之外,我得到以下信息:

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

可以肯定的是,此对多关系中的“设置”不会响应选择器“比较:”。

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

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

Using CoreData, I have an entity "Bookmark", that has an to-many relationship named 'tags' to another entity "Tag", and some commun attributes (string, date, ...).

In a NSTableView we display the Bookmarks entity via Binding:

  • the NSArrayController is binded to File's Owner.managedObjectContext
    (standard XCode CoreData template, the managedObjectContext is in the AppDelegate)
  • The columns in TableView are binded to their respective attribute. In particular the Tag column is binded to this arrayController.arrangedObjects.tags with a subclass of NSValueTransformer so that we can show, as an NSString, a summary of the to-many relationship.

It work. Now when I click on column header the whole table view get sorted correctly except for the 'tag' column where I get this:

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

For sure the "Set" from this to-many relationship doesn't respond to the selector 'compare:'.

Question:
How can I make this work ? How can I sort on a to-many relationship ?

Are something like the ValueTransformer available ? If I could supply a custom class that would do the compare: for the ArrayController to know...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

朕就是辣么酷 2024-12-26 04:08:33

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

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

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

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

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

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

你怎么认为 ?

One possible hack: since _NSFaultingMutableSet is a NSSet, we can add the selector 'compare:' via a categorie.

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

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

we can now implement this compare: selector as we wish, like comparing the count of each set, or their NSString representation in some way.

It work in my App. I re-enabled the 'Creates Sort Descriptor' on the binding of the NSTableColumn and can now click on the header of my tableView to sort.

It's a hack because it affect all NSSet... But at least I have my hook.

What do you think ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文