Cocoa 什么';从共享工具窗口和最前面的文档窗口进行绑定的好方法是什么?

Cocoa 什么';从共享工具窗口和最前面的文档窗口进行绑定的好方法是什么?,cocoa,cocoa-bindings,key-value-observing,Cocoa,Cocoa Bindings,Key Value Observing,我有一个允许打开多个NSC文档的应用程序。在这个应用程序中,有一个单一的实用程序窗口,其中包含一些我想应用于最前面文档的功能 我在这里尝试使用绑定,所以诀窍是如何将实用程序窗口的用户界面清晰地绑定到最前面的文档。目标是,然后切换最前面的文档窗口将更新实用程序窗口中的视图;当文档模型中的状态发生更改时,绑定到最前面文档模型属性的控件将相应更新,等等 对于从这样一个窗口发送操作,只需使用第一响应程序就很容易了;文档对象可以通过响应器链截获操作。但我想要的不止这些,当然你不能和第一反应者联系 我有一些

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

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

对于从这样一个窗口发送操作,只需使用第一响应程序就很容易了;文档对象可以通过响应器链截获操作。但我想要的不止这些,当然你不能和第一反应者联系

我有一些想法:

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

这些似乎都不完全正确。有没有更好的方法可以做到这一点,我还没有找到?

我总是通过共享应用程序,
mainWindow.document
绑定,这很好用。如果您有不带文档的windows,则可能需要添加一个
mainYourKindOfWindow
键,该键通过查看
mainWindow
并根据某些筛选条件更新值来实现

  • 在我的nib中为共享窗口放置一个对象控制器。当文档窗口更改最前面的状态时,请更改该绑定的内容
这对我来说是最有意义的。您需要将内容更改为文档实例(
[NSDocumentController currentDocument]

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


嗯?我不明白。Leopard的文本编辑是为它的检查员做的。请在中查看file:///Developer/Examples/AppKit/TextEdit.


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

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


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

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

澄清一下:如果我添加了另一个共享窗口,很像我正在使用的窗口,那么我还需要在文档中设置另一个绑定到该新窗口。这似乎增加了一层复杂性。为什么您需要在文档中绑定到实用程序窗口?文档需要与实用程序窗口对话的原因是什么?问题是当实用程序窗口是主窗口时。我希望最前面的文档窗口位于实用程序窗口下。在这种情况下,您不能使用此窗口或Peter建议的查看-[NSDocumentController currentDocument]。观察应用程序的主窗口并设置一些非应用程序属性,但实用程序窗口变为前窗口的情况除外。也就是说,有什么理由不在此处使用NSPanel吗?