NSDocument将事件发送到NSViewControllers的标准方法是什么?

时间:2016-12-03 20:34:28

标签: macos cocoa key-value-observing nsdocument nsviewcontroller

(背景:我有一个Cocoa应用程序,我写的工作正常,但太复杂,因为它没有良好的模型/视图/控制器分离。因此,我正在更新它使用NSDocument和NSWindowController / NSViewController。总的来说,这是一个很好的改变,但还有一些我还不太了解的部分。)

我有一个保存文档状态的NSDocument,以及NSWindowController的层次结构 - >管理逻辑的NSViewControllers。当视图控制器响应用户输入并需要更改某些状态时,它可以轻松获取其NSDocument并在其上调用方法以进行请求的更改(也将使用undoManager注册它,等等)。那个方向很好。

但另一方面不太明确。当NSDocument进行更改时(可能直接响应用户编辑,但可能没有),它通常如何将事件发送到视图控制器以更新视图?

我在Apple的文档中看到了一些方便的diagrams here,但我不清楚他们想要展示什么。橙色箭头被定义为“拥有并管理”,但它从未说过虚线箭头,双头箭头或双头箭头的含义。

他们是否意味着建议应用程序通常具有由NSWindowController中的方法表示的各种类型的状态更改,它们将它们传递给NSViewController树下的相应方法?这看起来很笨拙。

现在,我倾向于让我的NSDocument发布所有更改的NSNotifications,然后让NSViewControllers注册他们关心的通知。这似乎不那么笨拙,但可能仍然不理想。

编辑:或KVO? Apple的例子确实使用了KVO,但它也有一个更简单的数据模型。我不确定这对我有用,而且看起来似乎并不完全符合Swift的发展方向。我不想跳过没有美好未来的事情。

1 个答案:

答案 0 :(得分:-1)

我读过的所有东西都说是为了避免使用KVO,并且KVO在所有Cocoa中都是最差的API。所以,我们跳过它。

This old post on com.sys.mac.programmer.help说NotificationCenter是一个很好的解决方案:

  

我   首选项是在模型中的setter中发布通知   并注册我的窗口控制器(或任何控制器   控制视图)接收这些通知

由于某种原因,很难找到使用NSDocument的示例程序,但使用此模式的程序只有here's a simple example