2010-12-15 13 views
70

Ich frage mich nur, ob es eine Möglichkeit gibt, eine Methode aufzurufen, wo ich den Namen der Methode im laufenden Betrieb mit einer Zeichenfolge erstellen.Ziel C Aufruf Methode dynamisch mit einer Zeichenfolge

z.B. Ich habe eine Methode namens Loaddata

-(void)loadData; 

dies nenne ich es normalerweise wie

[self loadData]; 

nennen würde, aber ich möchte in der Lage sein, es mit einer Zeichenfolge dynamisch zu nennen z.B.

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

Dies ist ein dummes Beispiel, aber ich hoffe, Sie bekommen meinen Standpunkt. Ich verwende es für Databinding-Klassen, die ich für meine IPad-Anwendung aufstelle. Schwer zu erklären, aber um es in Brand zu setzen, muss ich herausfinden, wie man eine Methode mit einer Zeichenkette aufruft.

Irgendwelche Ideen?

Dank

+1

+1 für klare, einfache Frage! – Linuxmint

+0

Die Methode, die ich aufrufen möchte, ist eine Funktion, die einen NSString zurückgibt. – IPadHackAndSlash

Antwort

100

Sie können so etwas wie

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

In dieser Situation gibt die Methode einen Wert zurück, der in einem Fall ein NSString ist. Ich bekomme eine Fehlermeldung, dass Lvalue als linker Operand der Zuweisung benötigt wird. Dies ist mein Code: SEL s = NSSelectorFromString (@ "getIDString"); [eigener Text] = [boundEntity performSelector: s]; – IPadHackAndSlash

+0

Was ist [Selbsttext], wo Sie den Wert return getIDString zuweisen. – Ishu

+0

'[boundEntity performSelector: s]' gibt einen Wert vom Typ zurück, der nicht mit dem Typ von [[self text] 'übereinstimmt. Ich denke, Sie müssen @property für Text festlegen und rufen Sie '[self setText: [[boundEntity performSelector: s]]]'. – shreyasva

11

versuchen Sie können die objc_msgSend-Funktion verwenden. Es nimmt zwei Parameter, den Empfänger und den Wähler auf sie zu senden:

objc_msgSend(self, someSelector); 

Sie benötigen die Zeichenfolge in den entsprechenden Selektor drehen NSSelectorFromString mit:

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

Das Verfahren nimmt auch eine Variable Anzahl der Argumente, sodass Sie Nachrichten mit einer beliebigen Anzahl von Argumenten senden können.

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