Вызов какао IBAction из Углеродного кода - PullRequest
0 голосов
/ 07 ноября 2010

Я пытаюсь вызвать Какао IBAction из Углеродного кода ...

Я настроил глобальные ключи с помощью этого урока .

Горячие клавиши работают нормально, но мне нужно запустить IBAction, когда нажата глобальная клавиша.

Я получаю ошибки при использовании

[self functionName]

Как мне вызвать функцию?

Я читал о передаче контроллера Какао углеродному методу. Как бы я это сделал? или как лучше?

Ответы [ 2 ]

1 голос
/ 07 ноября 2010

Я предполагаю, что вы звоните [self functionName] в обратном вызове обработчика углеродных событий. Это не метод Objective-C, поэтому, конечно, self не определено.

Когда вы устанавливаете обработчик Carbon Event, одним из параметров является указатель «пользовательские данные». Вы можете передать указатель на объект Objective-C в этом параметре, чтобы ваш обработчик событий получил его, и вы могли сказать что-то вроде [(MyController*) inUserData functionName]. Конечно, чтобы это работало, ваш обработчик должен находиться в исходном файле Objective-C или Objective-C ++.

0 голосов
/ 07 ноября 2010

вы можете передать один из них как свои пользовательские данные, сохраняя программу безопасной для переводов 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;
};
...