Cocoa在多个窗口中验证菜单项

时间:2012-12-20 16:19:52

标签: objective-c cocoa first-responder

我有一个菜单项“foobar”,我需要在我的主窗口(app delegate)上启用,但在所有其他窗口上禁用。我想知道如何做到这一点,因为第一响应者的业务对我来说非常困惑。这就是我现在所拥有的:

  • “foobar”项目连接到MainMenu.xib中的第一响应者的“foobar:”自定义操作
  • 主应用代理中有一个“foobar:”操作,因此菜单项已启用并正常工作
  • 现在我加载了“makeKeyAndOrderFront”另一个窗口
  • 我专注于对新窗口的控制
  • 这是我的“foobar”项目应该被禁用的地方,但它不是

我可以看到在应用程序委托中调用了“validateMenuItem”,但是没有在第二个窗口的控制器中调用它。

有人可以用非常简单的术语向我解释为什么会发生这种情况以及我有什么选择来解决这个问题?

感谢您的想法

1 个答案:

答案 0 :(得分:1)

将您的app delegate设置为主窗口的委托,并实现以下方法:

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    [foobar setEnabled: YES];
}

- (void)windowDidResignKey:(NSNotification *)notification
{
    [foobar setEnabled: NO];
}

关于第一响应者

第一个响应者是窗口内的NSControl。例如,在特定窗口中,您有两个文本字段:textField1和textField2。当您输入输入时,只需要第一个响应者(接受所有控件之一)第一响应者。。所以你需要的是知道哪个窗口是关键的,你不需要知道谁是你特定情况下的第一个响应者。

编辑

还有另一种方法(可能更快,但取决于个人喜好)这样做:通过界面构建​​器,选择只有在某个窗口是键时才启用的菜单项。让我们假设这个窗口是一个名为window1的app委托的ivar。然后单击该菜单项,转到绑定检查器,在“enabled”下选择bind to:app delegate,model key path:self.window.isKeyWindow。

一个小小的图像提示:

enter image description here