macos - NSDocument 向 NSViewController 发送事件的标准方法是什么?

标签 macos cocoa key-value-observing nsdocument nsviewcontroller

(背景:我正在编写一个 Cocoa 应用程序,它运行良好,但太复杂,因为它没有很好地分离模型/ View / Controller 。因此,我将其更新为使用 NSDocument和 NSWindowController/NSViewController。总的来说,这是一个很好的改变,但有几个部分我还不太明白。)

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

但另一个方向不太清楚。当 NSDocument 进行更改时(可能是直接响应用户编辑,但也可能不是),它通常如何将事件发送到 View Controller 以更新 View ?

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

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

现在,我倾向于让我的 NSDocument 为所有更改发布 NSNotifications,然后让 NSViewController 准确注册他们关心的通知。这看起来不那么笨拙,但也许仍然不理想。

编辑:还是 KVO? Apple 的示例确实使用了一点 KVO,但它也有一个更简单的数据模型。我不确定这对我有用,而且它似乎也不完全符合 Swift 的发展方向。我不想跳上没有美好 future 的事情。

最佳答案

我读过的所有内容都说要避免 KVO,而且 KVO 的 API 是所有 Cocoa 中最差的。所以我们就跳过这个吧。

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

my preference has been to post a notification in my setters in the model and register my window controllers (or whatever controller is controlling the views) to receive those notifications

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

关于macos - NSDocument 向 NSViewController 发送事件的标准方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40952228/

相关文章:

python - 在 Mac OSX Lion 10.7.5 上将 python3.2 设置为默认值而不是 python2.7

objective-c - 单个 View 中的两个 NSTableView

objective-c - KVC数组: getters vs indexed accessors?

ios - KVO 本地通知

ios - Xcode - 如何修复 'NSUnknownKeyException' ,原因 : … this class is not key value coding-compliant for the key X"error?

Android 4.3 作为低功耗蓝牙外设

objective-c - 数据库与 FMDB 打开连接时出错

swift - dyld : Library not loaded: @rpath/libswiftDispatch. 动态库

objective-c - 整个对象属性的 KVO

iphone - 将iOS设备插入电脑,然后让电脑读取本地文件?