我有一个允许打开多个 NSDocument 的应用程序。在这个应用程序中是一个单一的实用程序窗口,其中包含一些我想应用于最前面的文档的功能。
我在这里尝试使用绑定,所以诀窍是如何将实用程序窗口的用户界面干净地绑定到最前面的文档。目标是切换最前面的文档窗口将更新实用程序窗口中的视图;当文档模型的状态发生变化时,绑定到最前面文档模型属性的控件将被适当地更新,等等。
对于从这样的窗口发送动作,很容易只使用第一响应者;文档对象可以通过响应者链拦截动作。但我想要的不止这些,当然你不能绑定到第一响应者。
我有几个想法:
- 在我的笔尖中为共享窗口放置一个对象控制器。当文档窗口更改最前面的状态时,更改该绑定的内容。这样做的一个缺点是,如果我有另一种实用程序窗口,我必须记住将文档窗口的绑定也连接到该实用程序窗口!
- 在应用程序委托中创建一个访问器,通过遍历窗口列表来获取最前面的文档窗口。我的实用程序窗口将通过应用程序委托的方法进行绑定。这里的一个缺点是它不符合 KVO
- 在应用程序委托中有一个 getter 和 setter 来确定(并且可能设置为与 KVO 兼容?这有意义吗?)最前面的文档。当窗口失去主状态时,也许使用窗口通知将 ivar 设置为适当的值。更新:我现在正在使用它,它实际上看起来很干净。我从我的文档窗口的windowDidBecomeMain通知中设置值并在windowWillClose中清除它(如果它是当前值)。除非有任何重大反对意见,否则这可能是我将使用的方法。
- 一个想法是绑定到 mainWindow.windowController.document ......这很接近,除了当我的共享窗口变为主窗口时,这个绑定就消失了。所以我真的需要找到最前面的文档窗口的控制器(以及正确的类)。
这些似乎都不对。有没有更好的方法来做到这一点,我错过了?