代码之家  ›  专栏  ›  技术社区  ›  Adam Preble

基于瞬时isRoot异常的NSTreeController获取谓词

  •  2
  • Adam Preble  · 技术社区  · 14 年前

    我的基于文档的Cocoa应用程序使用绑定到文档核心数据存储的NSOutlineView/NSTreeController组合。我的NSTreeController有fetch谓词 isRoot == YES isRoot 是默认值为的临时布尔属性 NO awakeFromInsert 电话:

    [self setIsRoot:[NSNumber numberWithBool:YES]];

    我可以很好地将对象添加到层次结构中,但当我尝试加载刚保存的文档时,会遇到一个异常:

    [<NSDictionaryMapNode 0x1001a8190> valueForUndefinedKey:]: this class is not key value coding-compliant for the key isRoot.

    伊斯鲁特 在xcdatamodel中属性为non transient,但是根据我对transient标志的理解,它不应该引起问题,而且这确实不是应该持久化的数据类型。

    我也尝试过实施 -isRoot 在NSManagedObject子类中返回相应的固定值,以及 setIsRoot: awakeFromFetch

    我还缺少什么微妙之处吗?我无法想象fetch谓词不支持瞬时属性。我不太了解核心数据的内部工作原理,但它试图查找 伊斯鲁特 在特定于存储的类上,而不是我的NSManagedObject子类上。

    3 回复  |  直到 14 年前
        1
  •  6
  •   John Gallagher    14 年前

    我无法想象fetch谓词 不支持瞬态属性。

    经过一番研究,我可以告诉你他们没有。 See this document.

    基于瞬态特性 要在内存中筛选的属性 你自己)。

    我已经建立了一个测试项目,可以验证我得到完全相同的错误,你做。

    当我需要过滤掉树中的根节点时,我会使用 parent == nil

    我理解你的反应-我也希望有一个专门称为isRoot属性的方法。我猜这是可能的,但它需要这么多的代码,只是不值得麻烦。

    mogenerator 会让你的生活更轻松。

        2
  •  1
  •   Nicholas Riley    13 年前

    另一种选择是为顶级节点提供一个单独的类,将该类名用作“实体名”,并将“Fetch Predicate”留空。只要子节点的值与顶级节点的值相同(我使用一个公共的超类/实体继承),一切都仍然正常。

        3
  •  0
  •   John Gallagher    14 年前

    您确定NSTreeController设置为控制实体而不是类吗?

    Tree Controller attribute screenshot

    我还认为也许isRoot可以继续使用。当然,这取决于你想用你的应用程序做什么,但如果它是一个在应用程序运行时加载的树视图,我要么让isRoot持久化。