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