我有2个nib文件MainMenu.xib,另一个是NSWindowController子类拥有的文件。
我在一个窗口面板上有4个选择,只能选择其中一个(如果选择了另一个,我想在新选择上设置一个复选标记,然后清除其他3个)
因此,通过将所有内容路由到“第一响应者”并在4个菜单选项上设置标签,我可以很容易地知道选择了哪个菜单项。
然后,接收到此动作的选择器仅查看标签,并执行所需的动作。并且,作为IBAction的一部分,我获得了对发件人的引用...所以我知道如何在其上设置对勾标记。也可以通过使用iVar跟踪最近单击的发件人来清除其他菜单项上的复选标记,然后按照Cocoa docs的建议执行此操作:
[currentItem setState:NSOffState];
[sender setState:NSOnState];
现在,问题归结为这是一个文档样式应用程序。菜单选择是全局的,因此每当新文档窗口获得焦点时,我就必须添加逻辑,而当窗口失去焦点时,则必须添加类似的逻辑。
我找到了可以实现
-windowDidBecomeMain
的方法,该方法告诉我窗口控制器何时成为主窗口。但是我没有看到相应的方法,该方法告诉我旧窗口失去了焦点,因此可以对其进行清理。 最佳答案
我找到了答案here。
其他方法是-windowDidResignMain
和-windowWillClose
编辑:我以前忽略的一个更好的答案是实现-(BOOL)validateMenuItem:
我已经将其视为仅通过返回值启用或禁用菜单项的方法,但我意识到我也可以提供设置状态的副作用。因此,NSWindowController被设置为窗口委托。菜单打开时,将调用此方法,因此该方法对于活动窗口始终是当前的。
关于objective-c - 如何获得对我在 cocoa 中单击的菜单项的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11788616/