【问题标题】:Cocoa validate menu items in multiple windowsCocoa 在多个窗口中验证菜单项
【发布时间】:2012-12-20 16:19:52
【问题描述】:

我有一个菜单项“foobar”,我需要在我的主窗口(应用程序委托)上启用它,但在所有其他窗口上禁用它。我想知道该怎么做,因为第一响应者的业务让我很困惑。这是我现在拥有的:

  • “foobar”项连接到 MainMenu.xib 中第一响应者的“foobar:”自定义操作
  • 主应用程序委托中有一个“foobar:”操作,因此菜单项已启用并可以正常工作
  • 现在我加载并“makeKeyAndOrderFront”另一个窗口
  • 我将一些控制集中在那个新窗口上
  • 这是我的“foobar”项目应该被禁用的地方,但它不是

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

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

感谢您的意见

【问题讨论】:

    标签: objective-c cocoa first-responder


    【解决方案1】:

    将您的应用代理设置为主窗口的代理,并实现这些方法:

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

    关于第一响应者

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

    编辑

    还有另一种(可能更快,但取决于个人喜好)的方法:通过界面生成器,选择要启用的菜单项,仅当某个窗口为键时。假设这个窗口是名为 window1 的应用程序委托的 ivar。然后单击该菜单项,转到绑定检查器,在“启用”下选择绑定到:应用程序委托,模型键路径:self.window.isKeyWindow。

    一点图片提示:

    【讨论】:

    • 那是手动启用项目。而且我不只使用一个菜单项或一个窗口。没有办法像在应用程序委托上那样实现自动启用吗?我想我可以转发一个 validateItem: call from app delegate to any window is key,但是所有这些变通方法都很奇怪......如果你不能让它“正常工作”而不必编写不必要的东西,那么 validateItem 的意义何在代码。
    • IB有办法,我会尽快写出来的。
    • 谢谢你的提示,拉米。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多