从共享实用程序窗口和最前面的文档窗口绑定的好方法是什么?

时间:2008-10-21 23:43:17

标签: cocoa cocoa-bindings key-value-observing

我有一个允许打开多个NSDocuments的应用程序。在此应用程序中是一个单独的实用程序窗口,其中包含一些我想要应用于最前面文档的功能。

我试图在这里使用绑定,所以诀窍是如何将实用程序窗口的用户界面干净地绑定到最前面的文档。目标是然后切换最前面的文档窗口将更新实用程序窗口中的视图;当文档模型中的状态发生变化时,绑定到最前面文档模型属性的控件将被适当更新。

要从这样的窗口发送动作,只需使用第一响应者即可;文档对象可以通过响应者链拦截动作。但我想要更多,当然你不能绑定第一响应者。

我有一些想法:

  • 在我的笔尖中放置一个对象控制器作为共享窗口。当文档窗口更改最前面的状态时,更改该绑定的内容。这样做的一个缺点是,如果我要使用另一种实用程序窗口,我必须记住将文档窗口中的绑定连接到该实用程序窗口!
  • 在应用程序委托中创建一个访问器,通过遍历窗口列表获取最前面的文档窗口。我的实用程序窗口将通过应用程序委托的方法绑定。这里的缺点是它不符合KVO
  • 在应用程序委托中有一个getter和setter来确定(并且可能设置为KVO兼容?这有意义吗?)最前面的文档。当窗口失去主要状态时,也许使用窗口通知将ivar设置为适当的值。 更新:我现在正在使用它,它实际上看起来很干净。我从我的文档窗口的 windowDidBecomeMain 通知中设置了值,并在 windowWillClose 中清除它(如果它是当前值)。除非有任何重大异议,否则这可能是我将使用的方法。
  • One idea是绑定到mainWindow.windowController.document ...这很接近,除了当我的共享窗口变为main时,这个绑定就会消失。所以我真的需要找到最前面的文档窗口的控制器(以及正确的类)。

这些似乎都不对。有没有更好的方法来做到这一点,我错过了?

5 个答案:

答案 0 :(得分:4)

我总是通过共享应用程序mainWindow.document绑定,这可以正常工作。如果您有没有文档的窗口,您可能需要添加mainYourKindOfWindow密钥,该密钥是通过观察mainWindow并根据某些过滤条件更新值来实现的。

答案 1 :(得分:3)

Leopard的TextEdit为其检查员执行此操作。在file:/// Developer / Examples / AppKit / TextEdit。

中查看

答案 2 :(得分:0)

  
      
  • 在我的笔尖中放置一个对象控制器作为共享窗口。当文档窗口更改最前面的状态时,请更改该绑定的内容。
  •   

这对我来说最有意义。您将内容更改为文档实例([NSDocumentController currentDocument])。

  

这样做的一个缺点是,如果我要使用另一种实用程序窗口,我必须记住将文档窗口中的绑定连接到该实用程序窗口!

咦?我不明白这一点。

答案 3 :(得分:0)

  

Leopard的TextEdit为其检查员执行此操作。请在> file:/// Developer / Examples / AppKit / TextEdit。

中查看

在TextEdit中,检查器值通过中间对象控制器绑定。控制器内容对象绑定到共享应用程序mainWindow。

您可以将内容绑定到mainWindow.firstResponder并取消选中“引发不适用的密钥”。

答案 4 :(得分:0)

使用键窗口,而不是主窗口。 NSApplication的keyWindow属性可能不支持KVO,但如果它不起作用,您仍然可以使用NSNotifications。原因是NSDocumentController的currentDocument使用keyWindow,因此它更好地代表了内置功能。此外,可以设置面板以避免成为关键窗口。