NSDocument 向 NSViewControllers 发送事件的标准方式是啥?
Posted
技术标签:
【中文标题】NSDocument 向 NSViewControllers 发送事件的标准方式是啥?【英文标题】:What's the standard way for NSDocument to send events to NSViewControllers?NSDocument 向 NSViewControllers 发送事件的标准方式是什么? 【发布时间】:2016-12-03 20:34:28 【问题描述】:(背景:我正在编写一个运行良好的 Cocoa 应用程序,但它太复杂了,因为它没有很好地分离模型/视图/控制器。因此,我正在更新它以使用 NSDocument和 NSWindowController/NSViewController。总体来说,这是一个很好的改变,但是有几个部分我还不太明白。)
我有一个保存文档状态的 NSDocument,以及管理逻辑的 NSWindowController -> NSViewControllers 的层次结构。当视图控制器响应用户输入并需要更改某些状态时,它可以轻松获取其 NSDocument 并调用其上的方法以进行请求的更改(这也会将其注册到 undoManager,等等)。这个方向很好用。
但另一个方向不太清楚。当 NSDocument 进行更改时(可能是直接响应用户编辑,但可能不是),它通常如何将事件发送到视图控制器以更新视图?
我在 Apple 的文档中看到了一些方便的 diagrams here,但我不清楚他们想要展示什么。橙色箭头被定义为“拥有和管理”,但它从未说明虚线箭头、双头箭头或双头箭头的含义。
他们的意思是说应用程序通常具有由其 NSWindowController 中的方法表示的每种类型的状态更改,这些方法将它们传递给 NSViewController 树下的相应方法吗?这似乎相当笨拙。
现在,我倾向于让我的 NSDocument 为所有更改发布 NSNotifications,然后让 NSViewControllers 准确注册他们关心的通知。这似乎不那么笨拙,但可能仍然不理想。
编辑:还是 KVO? Apple 的示例确实使用了一点 KVO,但它也有一个更简单的数据模型。我不确定这对我有用,而且它似乎也不完全符合 Swift 的发展方向。我不想跳上没有美好未来的事情。
【问题讨论】:
【参考方案1】:我读过的所有内容都说要避免使用 KVO,而且 KVO 的 API 是所有 Cocoa 中最差的。所以让我们跳过那个。
This old post on com.sys.mac.programmer.help 说 NotificationCenter 是一个很好的解决方案:
我的 偏好是在模型的我的设置器中发布通知 并注册我的窗口控制器(或任何控制器 控制视图)以接收这些通知
由于某种原因,很难找到使用 NSDocument 的示例程序,但 here's a simple example 使用这种模式的程序。
【讨论】:
请将代码的相关部分添加到您的答案中,而不是外部链接。 Arashsoft:答案基本上是“是的,这是一个合理的模式”。 github 链接只是证明至少有一个程序是以这种风格编写的,它本身并不是答案。事实上,问题本身就描述了这种模式。我认为在这里复制一个使用过时的 API 名称和过时的语言语法的示例没有任何价值,并且如果没有其程序其余部分的上下文就没有任何意义。 该外部链接现在给出了 404,这是复制和粘贴示例代码的另一个原因。以上是关于NSDocument 向 NSViewControllers 发送事件的标准方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章