这可能很简单,但我找不到它:
在我的应用程序中,我在三个独立的 NIB 中有三个窗口。一个在打开新文档时打开,另外两个可以从程序的窗口菜单中打开。
问题是:两个窗口(其中一个在开始时打开)接受正常的击键,例如用于保存的命令-s,而另一个不接受并发出警告声。我无法弄清楚两个窗口或它们的控制器之间的区别。我知道这与响应链有关,但我一无所知。
有任何想法吗?
这可能很简单,但我找不到它:
在我的应用程序中,我在三个独立的 NIB 中有三个窗口。一个在打开新文档时打开,另外两个可以从程序的窗口菜单中打开。
问题是:两个窗口(其中一个在开始时打开)接受正常的击键,例如用于保存的命令-s,而另一个不接受并发出警告声。我无法弄清楚两个窗口或它们的控制器之间的区别。我知道这与响应链有关,但我一无所知。
有任何想法吗?
Windows 不响应组合键。菜单项可以。为了响应被按下(无论是使用鼠标、使用组合键还是使用辅助功能),菜单项将其动作消息发送到响应者链中。
当响应者链中没有任何内容响应操作消息时,您会听到哔声。
假设这是一个基于 NSDocument 的应用程序,并且您已经启动了 Apple 的基于 doc 的应用程序模板,菜单项的操作是saveDocument:
,并且 NSDocument 对象是响应该消息的对象。当您的文档窗口处于活动状态时,它们的文档位于响应者链中,因此启用了发送该操作消息的菜单项。当您的第三个窗口处于活动状态时,文档不在响应者链中;没有其他响应该消息,因此菜单项被禁用。
这个问题不是特定于 Save 的——它会影响应该通过文档对象的所有操作消息。另一个重要的例子是打印:用户可能想要打印文档,而不是第三个窗口。
您可能已经使这第三个窗口成为一种与其他窗口对等的窗口。除了您遇到的这个响应链问题之外,用户也可能不会意识到他们已经离开了文档;他们希望仍然能够记录事情。考虑将其改为实用程序面板。
如果您确实有充分的理由将此窗口设为任何类型的窗口,则当第三个窗口变为主窗口时,您需要将最后一个活动的文档对象保留在响应程序链中,同时处理这种情况由于文档窗口(可能是最后一个)已关闭,因此窗口变为主窗口。
检查以确保窗口的委托设置为窗口控制器,并且窗口控制器实现-saveDocument:
(或保存项连接到的任何操作)。
好吧,事实证明,我实现第三个窗口的方式是使用 initWithNibFile 使用其控制器创建它,在控制器中运行一个过程,然后向它发送一个 [window close] 命令,因为我不希望它出现在屏幕呢。这以某种方式将其从与文档相关的窗口中取出,不知道为什么。不,我将该特定的调用过程迁移到文档控制器本身,将窗口视为第二个窗口,瞧,它又可以工作了。