NSWindow不响应击键命令-S

问题描述:

它可能很简单,但我不能找到它:NSWindow不响应击键命令-S

我有三个独立的发钞三个窗口在我的应用程序。一个打开新文档时打开,另外两个可以从程序的窗口菜单中打开。

问题是:两个窗口(其中一个是开始打开的窗口)接受正常的击键,例如command-s进行保存,另一个窗口不会,并且会发出警告声。我无法弄清楚两个窗口或其控制器之间的区别。我知道这将与响应者链有关,但我仍然无能为力。

任何想法?

检查以确保窗口的委托设置为窗口控制器,并且窗口控制器实现-saveDocument:(或保存项目连接到的任何操作)。

+0

但我不想执行saveDocument,也不是所有其他键盘快捷键,我只是想将它们传递给我的文档控制器。不知何故,他们不会被传递。 – wackazong 2009-12-17 15:12:16

+0

说明:文档不是文档控制器。文档控制器控制文档。 – 2009-12-17 18:11:37

Windows不响应按键组合。菜单项目。响应被按下(无论是使用鼠标,使用组合键还是使用辅助功能),菜单项都会将其操作消息发送到响应者链。

当响应者链中没有响应动作消息时,您会发出嘟嘟声。

假设这是一个基于NSDocument的应用程序,并且您已经启动了Apple的基于doc的应用程序模板,菜单项的操作是saveDocument:,NSDocument对象是对该消息作出响应的对象。当您的文档窗口处于活动状态时,其文档位于响应者链中,因此启用了发送该操作消息的菜单项。当您的第三个窗口处于活动状态时,文档不在响应者链中;没有其他回应该消息,所以菜单项被禁用。

此问题不是特定于保存 - 它影响应通过文档对象的所有操作消息。另一个重要的例子是打印:用户可能会打印文档,而不是第三个窗口。

您可能已将第三个窗口作为其他窗口的对等窗口存在。除了这个响应者链问题,用户也可能没有意识到他们已经离开了文档;他们希望仍然能够做文件的事情。考虑让它成为一个实用程序面板。

如果你确实有一个很好的理由让这个窗口成为任何窗口,那么当第三个窗口变为主窗口时,需要保留最后一个活动的文档对象时间处理窗口变成主要的情况,因为文档窗口(可能是最后一个)已经关闭。

+0

嘿,彼得, 非常感谢启发。第三个窗口实际上也是文档的一部分,我不知道如何设法使它成为非文档相关的窗口。它确实应该是一个文档窗口,就像第二个窗口已经是一样。 所以现在的问题是:为什么第三个窗口会变成与文档无关的窗口?我现在有想法。 – wackazong 2009-12-17 14:57:08

+0

通过发送文档'addWindowController:'消息,将窗口的窗口控制器添加到文档的窗口控制器中。你可能想在你的NSDocument子类的'makeWindowControllers'方法中做到这一点。 – 2009-12-17 18:11:07

嗯,事实证明,我实现了第三个窗口的方式,我用它的控制器使用initWithNibFile创建它,在控制器中运行一个过程,然后发送一个[window close]命令,因为我不想要它还未出现在屏幕上。不知怎的,它把它从文档关联的窗口中拿出来,不知道为什么。没有,我把那个特定的调用过程迁移到文档控制器本身,像第二个窗口那样对待窗口,然后它再次工作。

+0

是的,你需要用窗口控制器实例化窗口,并将其添加到文档的窗口控制器。看到我对我的答案的评论。 – 2009-12-17 18:12:10

+0

嗯,我之前也是这么做的。我看到的唯一区别是我现在第一次打开窗口时创建窗口。之前,我创建了它,然后发布了一个关闭命令以再次隐藏它,因为我不希望它从程序开始显示。该窗口随后将显示show命令,但当您发出关闭命令时,与窗口控制器的连接似乎已中断。 – wackazong 2009-12-25 11:51:26