2010-11-07 7 views
0

J'essaie d'appeler un cacao IBAction à partir du code de carbone ...Appel Cocoa IBAction du code carbone

J'ai mis en place des clés globales à l'aide this tutorial. Les touches de raccourci fonctionnent correctement, mais je dois déclencher un IBAction lorsque la touche globale a été enfoncée.

Je continue à obtenir des erreurs lors de l'utilisation

[self functionName] 

Comment appeler la fonction?

J'ai lu sur le passage du contrôleur Cocoa à la méthode au carbone. Comment ferais-je cela? ou quelle est la meilleure façon?

Répondre

1

Je suppose que vous appelez [self functionName] dans un rappel de gestionnaire d'événements Carbon. Ce n'est pas une méthode Objective-C, donc bien sûr self n'est pas défini. Lorsque vous installez un gestionnaire d'événements Carbon, l'un des paramètres est un pointeur "données utilisateur". Vous pouvez passer un pointeur d'objet Objective-C dans ce paramètre, afin que votre gestionnaire d'événements l'obtienne, et vous pouvez dire quelque chose comme [(MyController*) inUserData functionName]. Bien sûr, pour que cela fonctionne, votre gestionnaire doit être dans un fichier source Objective-C ou Objective-C++.

0

vous pouvez passer un de ces que vos données utilisateur tout en gardant le programme sûr pour C++ traductions:

/* 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; 
}; 
Questions connexes