【问题标题】:How to configure NSTreeController in Interface Builder如何在 Interface Builder 中配置 NSTreeController
【发布时间】:2015-04-30 00:52:14
【问题描述】:

当我在 Interface Builder(在 Xcode 4.6.3 中)中选择 NSTreeController 并查看属性检查器时,我看到名为 Tree Controller 和 Object Controller 的两个部分。树控制器部分有一定的意义,但我很难找到对象控制器部分的解释。第一项是“模式”,带有选项“类”和“实体名称”,我认为您在使用 Core Data 时使用后者,而在不使用时使用前者。我没有使用核心数据。那么,下一项 Class Name 的含义是什么?它默认为NSMutableDictionary,但我认为标准的树节点类型是NSTreeNode。具体来说,如果我希望我的树节点是 NSTreeNode,其表示的对象是 NSMutableDictionary,我将如何填写对象控制器部分?


回答后的事后思考:虽然我现在看到可以使用 NSMutableDictionary 类型的节点来构建大纲视图的内容树,但创建 NSTreeNode 的子类还是有好处的。首先,NSTreeNode 自动跟踪父链接,这在某些情况下很有用。其次,我可以将我的数据成员定义为属性,然后使用点符号而不是objectForKey: 消息来访问它们。

【问题讨论】:

    标签: xcode macos cocoa interface-builder nstreecontroller


    【解决方案1】:

    Object Controller 面板只是Interface Builder 的 方式,允许您设置NSTreeContollerentityName 属性或objectClass 属性。 (NSTreeControllerNSObjectController 的子类,这是定义这些属性的地方。)

    NSTreeNode 是 Cocoa 使用的一个类,用于在将对象(或实体)放入树中之前对其进行包装。在这个过程中你没有发言权,它是自动发生的,因此与 Attributes Inspector 无关。更重要的是,您很少(从不?)需要自己创建一个NSTreeNode 实例——尽管您会经常与它们进行交互。

    所以看起来您实际上不需要在此面板中执行任何操作 - 默认值就是您所追求的。当然,您仍然需要填写 Key Paths 部分。

    Here's a very simple demo project(使用 Xcode 6.3 创建)。希望这会有所帮助。

    【讨论】:

    • 我要补充一点,NSTreeController 的 content 是树的 root 对象或数组。树控制器将它在childrenKeyPath collection 中找到的每个对象包装在一个NSTreeNode 中。因此,使用 NSMutableDictionary 的 objectClass 和 allValues 的 childrenKeyPath,对于非叶节点,您将获得 NSMutableDictionary 类型的 NSTreeNode 表示的对象,但对于叶节点,您将获得其他类型。
    • 我还是很困惑。 (我无法找到使用基于视图的大纲视图与绑定但不是核心数据的示例。)如果您说我不应该自己创建树节点,这是否意味着您不建议使用 @ 987654331@?那么如何将数据放入表中?我试着说[self.treeController add: self]然后[self.outlineView reloadData],但之后[self.outlineView numberOfRows]返回0,但看起来表格中有一行。
    • 我在我的 GitHub 帐户上建立了一个示例项目 - 请参阅更新答案中的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多