Frage

In MyClass.m, ich habe definiert

- (void) myTest: (NSString *) withAString{
    NSLog(@"hi, %@", withAString);
}

und die entsprechende Erklärung in MyClass.h. Später möchte ich nennen

[self performSelector:@selector(mytest:withAString:) withObject: mystring];

in MyClass.m aber ich erhalte eine Fehlermeldung ähnlich * Beenden app aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: '* - [MyClass myTest: withAtring:]: Unbekannter Selektor zum Beispiel 0xe421f0 gesendet'

Ich habe versucht, einen einfacheren Fall mit einem Wähler, der keine Argumente haben, die eine Zeichenfolge gedruckt zu trösten und das funktionierte gut. Was ist falsch mit dem Code und wie kann ich es beheben? Danke.

War es hilfreich?

Lösung

Ihre Methodensignatur ist:

- (void) myTest:(NSString *)

withAString geschieht der Parameter (der Name ist irreführend, es sieht aus wie ein Teil des Wählers Unterschrift ist) zu sein.

Wenn Sie die Funktion auf diese Weise aufrufen:

[self performSelector:@selector(myTest:) withObject:myString];

Es wird funktionieren.

Aber, wie die anderen Plakate vorgeschlagen haben, können Sie die Methode umbenennen:

- (void)myTestWithAString:(NSString*)aString;

Und nennen:

[self performSelector:@selector(myTestWithAString:) withObject:myString];

Andere Tipps

In Objective-C, eine Unterschrift des Selektor besteht aus:

  1. Der Name der Methode (in diesem Fall wäre es 'myTest') (erforderlich)
  2. A ':'. (Kolon) nach dem Methodennamen, wenn die Methode einen Eingang
  3. Ein Name und ':' für jede weitere Eingabe
  4. .

Selektoren haben keine Kenntnis von:

  1. Die Eingangstypen
  2. Der Rückgabetyp der Methode.

Hier ist eine Klasse-Implementierung, bei performMethodsViaSelectors Verfahren die anderen Klassenmethoden mittels der Selektoren ausführt:

@implementation ClassForSelectors
- (void) fooNoInputs {
    NSLog(@"Does nothing");
}
- (void) fooOneIput:(NSString*) first {
    NSLog(@"Logs %@", first);
}
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
    NSLog(@"Logs %@ then %@", first, second);
}
- (void) performMethodsViaSelectors {
    [self performSelector:@selector(fooNoInputs)];
    [self performSelector:@selector(fooOneInput:) withObject:@"first"];
    [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];
}
@end

Die Methode, die Sie wollen einen Selektor schaffen für einen einzigen Eingang, so dass Sie einen Selektor für sie wie so schaffen würde:

SEL myTestSelector = @selector(myTest:);

@Shane Arney

performSelector:withObject:withObject:

Sie können auch erwähnen möchte, dass diese Methode nur für das Bestehen maximal 2 Argumente, und es kann nicht verzögert werden. (Wie performSelector:withObject:afterDelay:).

irgendwie komisch, dass Apple unterstützt nur 2 Objekte zu senden und nur knapp sein Ziel machen wird es mehr generisch.

Ihr Code hat zwei Probleme. Einer wurde identifiziert und beantwortet, aber der andere war es nicht. Die erste war, dass Ihre Wähler den Namen seines Parameter fehlt. Aber auch, wenn Sie beheben, dass wird die Linie immer noch eine Ausnahme auslösen, Ihre überarbeitete Methode Unterschrift unter der Annahme, noch mehr als ein Argument enthält. Lassen Sie uns sagen, dass Ihre überarbeitete Methode deklariert als:

-(void)myTestWithString:(NSString *)sourceString comparedTo:(NSString *)testString ;

Selektoren für Methoden erstellen, die mehrere Argumente vollkommen gültig ist (z @selector (myTestWithString: Vergleichzu :)). Jedoch nur die perform Methode ermöglicht es Ihnen, einen Wert zu myTest passieren, die leider mehr als einen Parameter hat. Es wird Fehler aus und Ihnen sagen, dass Sie nicht genug Werte haben liefern.

Sie können immer neu definieren Ihre Methode eine Sammlung zu nehmen, wie es nur Parameter sind:

-(void)myTestWithObjects:(NSDictionary *)testObjects ;

Allerdings gibt es eine elegantere Lösung (das ist es nicht erforderlich Refactoring). Die Antwort ist NSInvocation, zusammen mit seinen setArgument:atIndex: und invoke Methoden zu verwenden.

ich geschrieben habe ein Artikel, darunter ein Codebeispiel , wenn Sie weitere Informationen wünschen. Der Fokus liegt auf Threading, aber die Grundlagen gelten weiterhin.

Viel Glück!

Ihre Methodensignatur macht keinen Sinn, sind Sie sicher, dass es kein Tippfehler ist? Ich bin mir nicht klar, wie es selbst kompilieren, wenn auch vielleicht Sie bekommen Warnungen, die Sie ignorieren?

Wie viele Parameter erwarten Sie, diese Methode zu nehmen?

Denken soll die Klasse wie folgt definiert werden:

- (void) myTestWithSomeString:(NSString *) astring{
    NSLog(@"hi, %s", astring);
}

Sie haben nur einen einzigen Parameter, so dass Sie nur einen einzigen haben sollten:

Sie mögen vielleicht auch in Ihrer NSLog mit% @ betrachten - es ist nur eine gute Gewohnheit ist, in erhalten - dann jedes Objekt schreiben -. Nicht nur Zeichenfolge

  

iOS Benutzer auch autocapitalization erwarten: In einem Standard-Textfeld,   der erste Buchstabe eines Satzes in Groß- und Kleinschreibung Sprache   automatisch aktiviert.

     

Sie können entscheiden, ob solche Merkmale zu implementieren; es gibt kein   dedizierte API für jede der Funktionen nur aufgeführt, so sie die Bereitstellung   ist ein Wettbewerbsvorteil.

Apple-Dokument sagt es keine API für diese Funktion und einige andere erwartete Funktion in einer customkeyboard zur Verfügung steht. so müssen Sie Ihre eigene Logik, um herauszufinden, diese umzusetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top