12

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

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

对于从这样的窗口发送动作,很容易只使用第一响应者;文档对象可以通过响应者链拦截动作。但我想要的不止这些,当然你不能绑定到第一响应者。

我有几个想法:

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

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

4

5 回答 5

4

我一直通过 Shared Application 绑定mainWindow.document,效果很好。如果您有没有文档的窗口,您可能希望添加一个键,该键通过根据某些过滤条件mainYourKindOfWindow观察和更新值来实现。mainWindow

于 2008-10-22T17:55:51.987 回答
3

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

于 2008-10-23T02:10:33.377 回答
0
  • 在我的笔尖中为共享窗口放置一个对象控制器。当文档窗口更改最前面的状态时,更改该绑定的内容。

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

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

嗯?我不明白这一点。

于 2008-10-22T17:57:24.153 回答
0

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

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

您可以将内容绑定到 mainWindow.firstResponder 并取消选中“Raises for not applicable keys”。

于 2009-04-11T13:31:25.790 回答
0

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

于 2010-12-14T00:07:39.073 回答