0

我正在尝试IBAction从 Carbon 代码中调用 Cocoa ......

我已经使用本教程设置了全局键。

热键工作正常,但我需要在按下全局键时触发 IBAction。

我在使用时不断收到错误

[self functionName]

如何调用该函数?

我读过关于将 Cocoa 控制器传递给 carbon 方法的信息。我该怎么做?或者最好的方法是什么?

4

2 回答 2

1

我假设您正在调用[self functionName]Carbon 事件处理程序回调。那不是Objective-C方法,所以当然self没有定义。

当您安装 Carbon 事件处理程序时,其中一个参数是“用户数据”指针。你可以在这个参数中传递一个 Objective-C 对象指针,这样你的事件处理程序就会得到它,你可以说类似[(MyController*) inUserData functionName]. 当然,要完成这项工作,您的处理程序必须位于 Objective-C 或 Objective-C++ 源文件中。

于 2010-11-07T19:47:23.787 回答
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;
};
于 2010-11-07T20:10:55.000 回答