使我的子类拦截消息

时间:2013-02-08 20:51:57

标签: objective-c macos cocoa

我有一个NSPopUpButton我已经分类,我计划在我的程序中的多个位置使用。它是子类,因为它具有特殊的功能。

通常,要接收动作事件,您需要在控制器类中创建一个方法,然后将其与接口构建器连接以处理该操作。例如,如果用户更改了NSPopUpButton中的一个选项,它会向接口构建器操作方法发送消息,如下所示。

- (IBAction)sourcePopUpMenuChanged:(id)sender {
    NSLog(@"sourcePopUpMenuChanged");
}

在大多数情况下这很好,但在我的情况下,我想让它将消息发送到它自己的子类而不是控制器类。我想这样做是因为我在幕后设置一个全局变量来跟踪popUpMenu的索引,因为popupmenu出现在我的应用程序的许多不同窗口中。

我知道我可以为此控件的每个窗口创建IBAction个事件,并且每次都手动设置全局变量,但这似乎效率低下。

有没有办法,如果我的控件的任何实例接收到“操作”消息,我可以运行某种代码,例如,为gIndex = PopUpMenu Index Selected设置一个全局变量。

非常感谢帮助!

1 个答案:

答案 0 :(得分:4)

要回答您的问题,您可以覆盖sendAction:to:子类上的方法NSPopUpButton来完成您的工作。只是不要忘记拨打super,以便将操作消息转发给常规接收者。

当控件想要发送已配置的操作时,它会使用sendAction:to:方法调用sendAction:to:from:上的NSApp(单个NSApplication实例)。此方法在响应者链后面找到操作消息的最终接收者。