Вопрос

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

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

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

Я продолжаю получать ошибки, когда использую

[self functionName]

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

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

Это было полезно?

Решение

Я полагаю, ты звонишь [self functionName] В обратном вызове обработчиков углерода. Это не объективный метод, так что, конечно, self не определен.

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

Другие советы

Вы можете передавать одну из них в качестве пользовательских данных, сохраняя программу безопасной для переводов 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;
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top