2009-08-14 6 views
1

Je vois beaucoup d'API Objective-C/Cocoa SDK dans lesquelles vous pouvez spécifier une cible et une action qui seront rappelées.Appel des méthodes @selector entre les classes

Je veux faire la même chose dans deux de mes classes mais quand je stocke le passé dans le sélecteur et essayer plus tard pour l'appeler, je reçois l'exception,

« sélecteur non reconnu envoyé à instance »

Je passer à ClassB la cible et l'action comme celui-ci:

[myClassB doSomething:self action:@selector(anAction:)]; 

ClassB est déclaré et mis en œuvre comme celle-ci:

@interface ClassB 
{ 
    id target; 
    SEL targetAction; 
} 

@implementation ClassB 

-(void)theWork { 
if ([target respondsToSelector:targetAction]) 
{ 
    [target targetAction]; 
} 
} 

Au cours du processus de construction, je reçois aussi l'avertissement suivant:

pas de méthode 'de -targetAction' trouvé

Comment puis-je invoquer l'action cible qui a été fourni?

Ce que je veux atteindre est semblable à ceci:

UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
      target:self 
      action:@selector(cancelItem:)]; 

Répondre

4
[target targetAction]; 

signifie pour exécuter la méthode appelée targetAction.

vous voulez

[target performSelector:targetAction]; 
0

Vous devez mémoriser le nom de sélection dans votre Ivar:

ClassB *b = [[ClassB alloc] init]; 
SomeOtherClass *a = [[SomeOtherClass alloc] init]; 

// next two lines require properties to be declared 
b.target = a; 
b.targetAction = @selector(doTask:); 

Maintenant en ClassB vous pouvez invoquer la méthode sur un avec

[target performSelector:targetAction withObject:someObject]; 

Ce serait invoquer

- (void)doTask:(id)object 

sur la classe SomeOtherClass en lui passant un objet.

Questions connexes