【发布时间】:2014-06-22 14:34:29
【问题描述】:
这应该很容易,能有多难。
我有一个基于文档的核心数据应用程序,其数据模型非常简单。
我有一个“节点”实体,它与自身的父/子关系由 NSTreeController 控制,并通过 NSOutlineView 进行查看。 “节点”还与另一个由 NSArrayController 管理的实体类型“nodeProperties”具有非可选(对一个)关系。我有两个实体的 NSManagedObject 子类。我的文档类具有绑定到树控制器和数组控制器实例的出口。
我的问题是如何确保当大纲视图中的用户界面操作创建一个新的“节点”时,它与合适的(预先存在的)nodeProperties 对象的关系被填充。
我尝试过/考虑过的方法:
让树控制器创建“节点”(通过其 add:、addChild: 操作)并在“节点”子类 awakeFromInsert 方法中填充与 nodeProperties 对象的关系。问题是我找不到从“节点”的 awakeFromInsert 中访问任何 nodeProperties 对象的方法。 “适当的”nodeProperties 对象可从文档类中的方法获得,但从节点 awakeFromInsert 方法访问文档对象似乎违反了 MVC 的原则,并且我已经阅读到共享文档对象在拖动中并不总是安全的和删除操作(在我的例子中也创建了一个新的节点对象)
在文档类中编写 add: 和 addChild: 操作方法,并从最终用户操作而不是树控制器调用这些方法(我的拖放支持也在文档类中)。然后从这些方法中调用树控制器中的 add: 和 addChild: 方法,然后在新创建的节点上设置 nodeProperties 关系。问题是我不知道如何让树控制器给我一个新创建的节点的引用?我尝试使用 selectedObjects 方法获取父节点,然后比较添加前后的父子节点以获取新节点。但是此时儿童内容没有变化——也许是延迟更新?
作为 2 的变种,根本不使用树控制器 add:/addChild: 方法,而是在文档中创建节点实体对象 add:/addChild: 方法使用树控制器 selectedOjects 来得到父母。我不太喜欢这样,因为它似乎在树控制器后面做一些事情,而且我必须 setContent: 每次创建根对象。
我已经考虑过观察新创建节点的创建的可能性,但我不知道要观察什么来实现。
以前一定有人做过这样的事情 - 但我拖网无济于事。非常欢迎所有帮助、建议和指导。
【问题讨论】:
-
Re: 2 --
InsertChild确实被安排在运行循环中,其中一些等效于dispatch_async。您可以尝试使用dispatch_async在insertChild之后运行您自己的代码块。 -
不过,我认为我更喜欢的是覆盖更新父项上的 childrenKeyPath 的方法,以“观察”childrenSet 中的变化并对那里添加的新子项做出反应。
标签: objective-c core-data model-view-controller nsoutlineview nstreecontroller