In MyClass.m habe ich definiert
- (void) myTest: (NSString *) withAString{
NSLog(@"hi, %@", withAString);
}
und die entsprechende Erklärung in MyClass.h. Später möchte ich anrufen
[self performSelector:@selector(mytest:withAString:) withObject: mystring];
in MyClass.m, aber ich erhalte eine ähnliche Fehlermeldung wie * Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSInvalidArgumentException', Grund: '* - [MyClass myTest: withAtring:]: nicht erkannter Selektor an Instanz 0xe421f0 gesendet'
Ich habe einen einfacheren Fall mit einem Selektor versucht, der keine Argumente enthielt, die einen String auf die Konsole druckten, und der einwandfrei funktionierte. Was ist mit dem Code falsch und wie kann ich ihn beheben? Vielen Dank.
Antworten:
Ihre Methodensignatur lautet:
withAString ist zufällig der Parameter (der Name ist irreführend, es sieht so aus, als ob er Teil der Signatur des Selektors ist).
Wenn Sie die Funktion folgendermaßen aufrufen:
Es wird klappen.
Wie in den anderen Postern vorgeschlagen, möchten Sie die Methode möglicherweise umbenennen:
Und Ruf an:
quelle
In Objective-C besteht die Signatur eines Selektors aus:
Selektoren haben keine Kenntnis von:
Hier ist eine Klassenimplementierung, bei der die Methode performMethodsViaSelectors die anderen Klassenmethoden über Selektoren ausführt:
Die Methode, für die Sie einen Selektor erstellen möchten, hat eine einzige Eingabe. Sie würden also einen Selektor dafür erstellen:
quelle
@ Shane Arney
Möglicherweise möchten Sie auch erwähnen, dass diese Methode nur zum Übergeben von maximal 2 Argumenten dient und nicht verzögert werden kann. (wie
performSelector:withObject:afterDelay:)
.Ein bisschen komisch, dass Apple nur 2 zu sendende Objekte unterstützt und es nicht allgemeiner macht.
quelle
Ihr Code hat zwei Probleme. Einer wurde identifiziert und beantwortet, der andere jedoch nicht. Das erste war, dass Ihrem Selektor der Name seines Parameters fehlte. Selbst wenn Sie dies beheben, wird in der Zeile dennoch eine Ausnahme ausgelöst, vorausgesetzt, Ihre überarbeitete Methodensignatur enthält immer noch mehr als ein Argument. Angenommen, Ihre überarbeitete Methode lautet wie folgt:
Das Erstellen von Selektoren für Methoden mit mehreren Argumenten ist vollkommen gültig (z. B. @selector (myTestWithString: compareTo :)). Mit der performSelector-Methode können Sie jedoch nur einen Wert an myTest übergeben, das leider mehr als einen Parameter enthält. Es wird ein Fehler ausgegeben und Sie werden darauf hingewiesen, dass Sie nicht genügend Werte angegeben haben.
Sie können Ihre Methode jederzeit neu definieren, um eine Sammlung als einzigen Parameter zu verwenden:
Es gibt jedoch eine elegantere Lösung (für die kein Refactoring erforderlich ist). Die Antwort ist, NSInvocation zusammen mit seinen
setArgument:atIndex:
undinvoke
Methoden zu verwenden.Ich habe einen Artikel geschrieben, einschließlich eines Codebeispiels , wenn Sie weitere Details wünschen. Der Fokus liegt auf dem Einfädeln, aber die Grundlagen gelten weiterhin.
Viel Glück!
quelle
Ihre Methodensignatur macht keinen Sinn. Sind Sie sicher, dass es sich nicht um einen Tippfehler handelt? Ich bin mir nicht sicher, wie es überhaupt kompiliert wird, obwohl Sie vielleicht Warnungen erhalten, die Sie ignorieren?
Wie viele Parameter erwarten Sie für diese Methode?
quelle
Denken Sie, die Klasse sollte definiert werden als:
Sie haben nur einen einzigen Parameter, daher sollten Sie nur einen einzigen haben:
Vielleicht möchten Sie auch% @ in Ihrem NSLog verwenden - es ist nur eine gute Angewohnheit, sich darauf einzulassen - und dann jedes Objekt ausschreiben - nicht nur Zeichenfolgen.
quelle
Laut Apple-Dokument ist für diese Funktion und eine andere erwartete Funktion in einem benutzerdefinierten Keyboard keine API verfügbar. Sie müssen also Ihre eigene Logik herausfinden, um dies zu implementieren.
quelle