Creazione di un selettore da un nome di metodo con parametri

Ho un esempio di codice che ottiene una SEL dall’object corrente,

 SEL callback = @selector(mymethod:parameter2); 

E ho un metodo come

  -(void)mymethod:(id)v1 parameter2;(NSString*)v2 { } 

Ora ho bisogno di spostare il mymethod su un altro object, ad esempio myDelegate .

Ho provato:

 SEL callback = @selector(myDelegate, mymethod:parameter2); 

ma non verrà compilato.

SEL è un tipo che rappresenta un selettore in Objective-C. La parola chiave @selector () restituisce una SEL che descrivi. Non è un puntatore a funzione e non è ansible passare alcun object o riferimento di alcun tipo. Per ogni variabile nel selettore (metodo), devi rappresentarlo nella chiamata a @selector. Per esempio:

 -(void)methodWithNoParameters; SEL noParameterSelector = @selector(methodWithNoParameters); -(void)methodWithOneParameter:(id)parameter; SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here -(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo; SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted 

I selettori vengono generalmente passati a debind metodi e a callback per specificare quale metodo deve essere chiamato su un object specifico durante una richiamata. Ad esempio, quando si crea un timer, il metodo di callback è definito in modo specifico come:

 -(void)someMethod:(NSTimer*)timer; 

Quindi, quando pianifichi il timer, useresti @selector per specificare quale metodo sul tuo object sarà effettivamente responsabile per il callback:

 @implementation MyObject -(void)myTimerCallback:(NSTimer*)timer { // do some computations if( timerShouldEnd ) { [timer invalidate]; } } @end // ... int main(int argc, const char **argv) { // do setup stuff MyObject* obj = [[MyObject alloc] init]; SEL mySelector = @selector(myTimerCallback:); [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES]; // do some tear-down return 0; } 

In questo caso si specifica che l’object deve essere inviato con myTimerCallback ogni 30 secondi.

Non puoi passare un parametro in un @selector ().

Sembra che tu stia cercando di implementare una richiamata. Il modo migliore per farlo sarebbe qualcosa del genere:

 [object setCallbackObject:self withSelector:@selector(myMethod:)]; 

Quindi nel setCallbackObject dell’object: withSelector: method: puoi chiamare il tuo metodo di callback.

 -(void)setCallbackObject:(id)anObject withSelector:(SEL)selector { [anObject performSelector:selector]; } 

Oltre a ciò che è stato già detto sui selettori, è ansible che si desideri esaminare la class NSInvocation.

Un NSInvocation è un messaggio Objective-C reso statico, ovvero un’azione trasformata in object. Gli oggetti NSInvocation vengono utilizzati per archiviare e inoltrare messaggi tra oggetti e tra applicazioni, principalmente da oggetti NSTimer e dal sistema di oggetti distribuiti.

Un object NSInvocation contiene tutti gli elementi di un messaggio Objective-C: una destinazione, un selettore, argomenti e il valore restituito. Ciascuno di questi elementi può essere impostato direttamente e il valore di ritorno viene impostato automaticamente quando viene inviato l’object NSInvocation.

Tieni presente che, sebbene sia utile in determinate situazioni, non usi NSInvocation in una normale giornata di programmazione. Se stai solo cercando di far dialogare due oggetti, valuta la possibilità di definire un protocollo delegato informale o formale, o di passare un selettore e un object di destinazione come già detto.