【发布时间】: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