我正试图从Carbon代码中调用Cocoa IBAction
...
我使用this tutorial设置了全局密钥。
热键工作正常,但是我需要在按下全局键时触发IBAction。
我使用
时一直出错[self functionName]
如何调用此功能?
我已经阅读过关于将Cocoa控制器传递给碳方法的内容。我该怎么做?或者最好的方法是什么?
答案 0 :(得分:1)
我假设您在Carbon事件处理程序回调中调用[self functionName]
。这不是Objective-C方法,因此当然没有定义self
。
安装Carbon Event处理程序时,其中一个参数是“用户数据”指针。您可以在此参数中传递Objective-C对象指针,以便您的事件处理程序可以获取它,并且您可以说[(MyController*) inUserData functionName]
之类的内容。当然,要使这项工作,您的处理程序必须位于Objective-C或Objective-C ++源文件中。
答案 1 :(得分:0)
您可以传递其中一个作为您的用户数据,同时保持程序对c ++翻译的安全:
/* include the necessary C header, located in objc/ (objc/objc.h?) */
/* of course, definitions with objc messaging belong in your .mm file */
class t_ibaction_invocation {
/* you may want to retain d_target or d_optionalArgument, and release at destruction */
enum { RetainArguments = 0 };
public:
/* IBAction takes the form: [target action:optionalArgument]; */
t_ibaction_invocation(id target, SEL action, id optionalArgument) : d_target(target), d_action(action), d_optionalArgument(optionalArgument) {
assert(this->d_target);
if (RetainArguments) {
[this->d_target retain];
[this->d_optionalArgument retain];
}
}
~t_ibaction_invocation() {
if (RetainArguments) {
[this->d_target release], target = 0;
[this->d_optionalArgument release], optionalArgument = 0;
}
}
id performAction() {
if (this->d_target && this->d_action) {
return [this->d_target performSelector:this->d_action withObject:this->d_optionalArgument];
}
else {
assert(d_target && d_action);
return 0;
}
}
private:
id d_target;
SEL d_action;
id d_optionalArgument;
};