1

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

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

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

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

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

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

4

2 回答 2

1

我在这里找到了答案。

其他方法是-windowDidResignMain-windowWillClose

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

于 2012-08-03T13:40:57.513 回答
0

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

于 2012-08-03T03:52:57.680 回答