2010-08-01 8 views
2

Je suis un peu perplexe et je travaille sur ce sujet depuis des heures et googling sans réelles pistes. Je souhaite créer un rappel dans Objective-C pour mon application iPhone en utilisant le @selector.@selector dans objectif-c ne se comporte pas comme prévu

Classe 1:

- (void) someMethod {  
    // create selector 
    SEL successCallback = @selector(successMethod); 

    // call some service with caller and selector 
    [class2 dispatchSomeEvent:self callback:successCallback]; 

    // here's the call back method 
    - (void) successMethod { 
     NSLog(@"Callback success"); 
    } 
} 

Classe 2:

// some event 
- (void) dispatchSomeEvent:(id) caller selector:(SEL) successCallback { 
    // catch the event and execute callback 
    if ([caller respondsToSelector:successCallback]) { 
     [caller successCallback]; 
    } 
} 

Le respondsToSelector conditionnel passera mais le rappel sur la ligne suivante échouera. Cependant, si je le ferais comme ceci:

// catch the event and execute callback 
if ([caller respondsToSelector:successCallback]) { 
    [caller successMethod]; 
} 

Ainsi, au lieu d'utiliser le sélecteur je suis passé, je tape le nom de méthode directement ... et ça marche!

L'erreur que je reçois est la suivante:

sélecteur non reconnu envoyé à l'instance 0x6c37f70

Qu'est-ce qui se passe ici ??

Merci d'avance!

+0

Le compilateur doit être vomissant un avertissement que l'appelant ne répond pas à successMethod. – bbum

+0

Le rappel 'successMethod' devrait vous donner une erreur de syntaxe si ce code est verbatim. Vous ne pouvez pas définir de méthodes dans d'autres méthodes. – JeremyP

Répondre

3

Vous devriez appeler votre sélection à l'aide -performSelector méthode:

if ([caller respondsToSelector:successCallback]) { 
    [caller performSelector:successCallback]; 
} 
+0

Peu importe. J'étais dense. :) – bbum

+0

Merci Vladimir. –

Questions connexes