如果 NSArrayController 上的 setFilterPredicate 在“自动重新排列内容”中,它就不起作用

Posted

技术标签:

【中文标题】如果 NSArrayController 上的 setFilterPredicate 在“自动重新排列内容”中,它就不起作用【英文标题】:setFilterPredicate on a NSArrayController doesn't work if it's in "Auto Rearrange Content" 【发布时间】:2011-12-01 12:22:52 【问题描述】:

我有一个经典的 CoreData 应用程序,通过 Binding 在 NSTableView 中显示它的数据(全部使用 XCode 4.2 完成)。

工作正常,直到我昨天决定在属性检查器中检查 ArrayController 的“自动重新排列内容”。现在,当我尝试对其设置过滤谓词时,我得到:

[<_NSFaultingMutableSet 0x102b65950> addObserver:forKeyPath:options:context:] is not supported. Key path: name

请记住,如果没有此选项,它可以完美运行:谓词很好,控制器正在正确过滤它的托管内容,并且表格视图仅显示与谓词匹配的实体。

当然,我可以取消启用此“自动重新排列内容”,但它对于在实体发生更改时保持排序顺序很有用。如果我编辑一个实体,“修改日期”会发生变化,并且由于我的排序顺序是在这个日期,我希望 TableView 自动重新排序它的行。它确实与此选项有关,但可惜添加了“不支持 addObserver”的错误。

_NSFaultingMutableSet 来自相关实体中的一对多关系,因此是“Set”。也许“自动重新排列内容”与具有一对多关系的“setFilterPredicate”不兼容?

有人遇到类似问题吗? NSArrayController 的内部错误?

注意:导致问题的谓词格式为

name CONTAINS[cd] %@ OR ANY aliases.name CONTAINS[cd] %@

ANY tags.name CONTAINS[cd] %@ OR ANY tags.aliases.name CONTAINS[cd] %@

似乎“ANY”引起了一些冲突......

【问题讨论】:

显然,每当我遍历一对多关系的键路径时,我都需要使用子查询?见:***.com/a/3646030/1040553 【参考方案1】:

找到了解决方案,上面对SUBQUERY的评论。

保留“自动重新排列内容”选项,但将谓词更改为:

name CONTAINS[cd] %@ OR SUBQUERY(aliases, $anAlias, $anAlias.name CONTAINS[cd] %@).@count != 0

SUBQUERY(tags, $aTag, $aTag.name CONTAINS[cd] %@).@count !=0 OR SUBQUERY(tags, $aTag, $aTag.aliases.name CONTAINS[cd] %@).@count !=0

分别。

可能谓词错了,我只是之前没有遇到其他问题。

【讨论】:

以上是关于如果 NSArrayController 上的 setFilterPredicate 在“自动重新排列内容”中,它就不起作用的主要内容,如果未能解决你的问题,请参考以下文章

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

两个 NSArrayController 和一个关系(CoreData)

NSArrayController 的奇怪行为

NSTableView 绑定到 NSArrayController

为啥 NSArrayController 在插入对象后“失去”排序?

过滤 NSArrayController 的问题