2010-12-15 11 views
70

Mi chiedo solo se esiste un modo per chiamare un metodo in cui si costruisce il nome del metodo al volo con una stringa.Metodo di chiamata all'obiettivo C dinamicamente con una stringa

ad es. Ho un metodo chiamato loaddata

-(void)loadData; 

chiamare questo io normalmente chiamarlo come

[self loadData]; 

ma voglio essere in grado di chiamare in modo dinamico con una stringa per esempio

NSString *methodName = [[NSString alloc] initWithString:@"loadData"]; 
[self methodName]; 

Questo è un esempio stupido ma spero che tu abbia capito il mio punto. Lo sto usando per le classi di database che sto configurando per la mia applicazione IPad. Difficile da spiegare, ma per farlo esplodere ho bisogno di capire come chiamare un metodo con una stringa.

Qualche idea?

Grazie

+1

+1 per una domanda chiara e semplice! – Linuxmint

+0

Il metodo che voglio chiamare è una funzione che restituisce una NSString. – IPadHackAndSlash

risposta

100

Si può provare qualcosa di simile

SEL s = NSSelectorFromString(selectorName); 
[anObject performSelector:s]; 
+0

In questa situazione il metodo restituisce un valore che è una NSString in un caso. Ricevo un errore che dice Lvalue richiesto come operando sinistro del compito. Questo è il mio codice: SEL s = NSSelectorFromString (@ "getIDString"); [testo automatico] = [boundEntity performSelector: s]; – IPadHackAndSlash

+0

cos'è [testo automatico], in cui si assegna il valore restituito getIDString. – Ishu

+0

'[boundEntity performSelector: s]' restituisce un valore di tipo che non corrisponde al tipo di '[auto testo]'. Penso che sia necessario impostare @property per il testo e chiamare '[self setText: [[boundEntity performSelector: s]]]. – shreyasva

11

È possibile utilizzare la funzione objc_msgSend. Ci vogliono due parametri, il ricevitore e il selettore di inviare ad esso:

objc_msgSend(self, someSelector); 

Avrai bisogno di trasformare la stringa nel selettore appropriato utilizzando NSSelectorFromString:

NSString *message = [self getSomeSelectorName]; 
objc_msgSend(self, message); 

Il metodo accetta anche una variabile numero di argomenti, quindi è possibile inviare messaggi con qualsiasi numero di argomenti.

NSString *message = [self getSomeSelectorNameWithManyArguments]; 
objc_msgSend(self, message, arg1, arg2, arg3, arg4);