2010-11-07 3 views
0

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

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

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

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

[self functionName] 

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

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

ответ

1

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

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

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; 
}; 
Смежные вопросы