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

时间:2011-12-01 12:22:52

标签: objective-c cocoa core-data cocoa-bindings nsarraycontroller

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

工作正常,直到我昨天决定在Attributes Inspector中检查ArrayController的“Auto Rearrange Content”。现在,当我尝试在其上设置过滤谓词时,我得到:

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

请记住,如果没有此选项,它可以正常工作:谓词很好,控制器正在过滤它的托管内容,而表视图只显示与谓词匹配的实体。

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

_NSFaultingMutableSet来自相关实体中的多对多关系,因此是“Set”。也许“Auto Rearrange Content”与“setFilterPredicate”与多对多关系不兼容?

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

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

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

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

似乎'ANY'引起了一些冲突......

1 个答案:

答案 0 :(得分:4)

找到一个解决方案,上面有关于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

分别

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