【问题标题】:How do I get a reference to the menu item i clicked on in Cocoa?如何获得对我在 Cocoa 中单击的菜单项的引用?
【发布时间】:2012-08-03 02:57:27
【问题描述】:

我有 2 个 nib 文件,MainMenu.xib,另一个归 NSWindowController 子类所有。 我在一个窗口面板上有 4 个选项,其中只能选择一个(如果选择了另一个,我想在新的上设置一个复选标记,并清除其他 3 个)

所以我可以很容易地判断选择了哪个菜单项,方法是通过 First Responder 路由所有内容,并在 4 个菜单选项上设置标签。

然后,接收该动作的选择器只查看标签,并采取所需的动作。而且,作为 IBAction 的一部分,我得到了对发件人的引用......所以我知道如何在它上面设置复选标记。清除另一个菜单项上的复选标记也可以通过使用 iVar 来跟踪最近点击的发件人,然后我可以这样做,正如 Cocoa 文档所建议的那样:

[currentItem setState:NSOffState];
[sender setState:NSOnState];

现在问题归结为这是一个文档样式的应用程序。菜单选择是全局的,所以每当一个新的文档窗口获得焦点时,我都必须添加逻辑,当窗口失去焦点时,我必须添加类似的逻辑。

我找到了一种可以实现-windowDidBecomeMain 的方法,它告诉我我的窗口控制器何时成为主窗口。但我没有看到相应的方法告诉我旧窗口失去焦点,因此可以清理。

【问题讨论】:

  • 这些菜单项是什么类?为什么不直接将 IBOutlet 连接到它们? (因为那将是最简单、最好的方法)
  • 我很想将 IBOutlet 连接到他们。但是怎么做?在 MainMenu.xib 中,我有 File's Owner(NSApplication 对象)和 First Responder 对象……差不多就是这样。当 MainMenu 在启动时被实例化时,接收 IBAction 的控制器甚至还不存在。
  • 我有点困惑。哪个控制器接收 IBAction? (或者它存在于哪个 nib 文件中?)
  • 控制器正在以编程方式创建。如果它被移动到一个 nib 文件,它不能是 MainMenu.nib,因为我只有 1 个实例。作为一个文档风格的程序,我可以有很多 NSWindowController 的实例。我想我已经掌握了如何解决这个问题,我会更新问题

标签: objective-c cocoa


【解决方案1】:

我找到了答案here。

其他方法有-windowDidResignMain和-windowWillClose

编辑:我之前忽略的一个更好的答案是实现-(BOOL)validateMenuItem: 我曾将此视为仅通过返回值启用或禁用菜单项的一种方式,但我意识到我也可以提供设置状态的副作用。所以 NSWindowController 被设置为窗口委托。打开菜单时,会调用此方法,因此它始终是活动窗口的当前方法。

【讨论】:

  • 是的,-(BOOL)validateMenuItem: 是这里的完美答案。
【解决方案2】:

创建一个新对象(继承自 NSObject)作为您的控制器对象。从 nib 文件实例化它并将插座链接到那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多