如何获取我在Cocoa中单击的菜单项的引用?

时间:2012-08-03 02:57:27

标签: objective-c cocoa

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

因此,我可以通过在First Responder中路由所有内容,并在4个菜单选项上设置标签,轻松判断选择了哪个菜单项。

然后,接收此操作的选择器只查看标记,并采取所需的操作。而且,作为IBAction的一部分,我得到了对发件人的引用......所以我知道如何设置它的复选标记。清除其他菜单项上的复选标记也可以通过使用iVar跟踪最近点击的发件人来完成,然后我可以按照Cocoa文档的建议执行此操作:

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

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

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

2 个答案:

答案 0 :(得分:1)

我找到了答案here

其他方法是-windowDidResignMain-windowWillClose

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

答案 1 :(得分:0)

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