4

我有一个经典的CoreData应用程序,显示它的数据在绑定NSTableView(全部用XCode 4.2完成)。setFilterPredicate对NSArrayController不起作用,如果它在“自动重新安排内容”

工作正常,直到我决定昨天在Attributes Inspector中检查ArrayController的'Auto Rearrange Content'。现在,当我尝试设置过滤谓词就可以了,我得到:

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

请记住,如果没有这个选项,它完美地工作:谓语是好的,则控制器可以正常过滤它的管理的内容,以及表视图仅显示与谓词相匹配的实体。

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

_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] %@ 

这似乎是 '任意' 会引起一些冲突...

+0

显然我需要使用子查询,每当我走一个关键路径跨多对多的关系?请参阅:http://stackoverflow.com/a/3646030/1040553 – malaba

回答

4

找到了一个解决方案,并对SUBQUERY进行了上述评论。

请选择 '自动重新编排内容',但改变谓词:

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

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

分别。

也许这个谓词错了,我之前没有遇到别人的问题。