2010-12-29 17 views
5

Wie ruft man eine @selector-Methode mit mehreren Argumenten auf?@selector mit mehreren Argumenten

Ich habe folgendes

[self performSelector:@selector(changeImage:withString:) withObject:A1 withObject:fileString2 afterDelay:0.1]; 

aber ein

Unbekannter Selektor ist gesendet Instanz

Fehler

Meine Methode, die ich anrufen bekommen bin wie folgt

-(void) changeImage: (UIButton *) button withString: (NSString *) string 
{ 
[button setImage:[UIImage imageNamed:string] forState:UIControlStateNormal]; 
} 

Antwort

18

Sie sollten NSInvocation verwenden

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: 
          [self methodSignatureForSelector:@selector(changeImage:withString:)]]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(changeImage:withString:)]; 
[invocation setArgument:A1 atIndex:2]; 
[invocation setArgument:fileString2 atIndex:3]; 
[NSTimer scheduledTimerWithTimeInterval:0.1f invocation:invocation repeats:NO]; 
+0

Cool, danke. Wie soll ich es nennen? Ich möchte das an vielen Orten nennen. Kann es also in der viewDidLoad-Methode deklariert werden und dann an verschiedenen Stellen aufgerufen werden? – jarryd

+0

Ich verstehe nicht wirklich, was du meinst. Sie können diesen Teil des Codes überall in der Klasse einfügen, wo changeImage: withString: definiert ist. Wenn Sie es mehrmals aufrufen möchten, sollten Sie es in eine Methode einfügen und stattdessen diese Methode aufrufen. – Jilouc

+1

alternativ können Sie '[Aufruf performSelector: @selector (invoke) withObject: nil afterDelay: 0.1];' – user102008

0

Sie rufen performSelector:withObject:withObject:afterDelay:, aber diese Methode existiert nicht.

Ihre einzige Option ist performSelector:withObject:withObject:, aber Sie können keine Verzögerung mit dieser Methode angeben. Wenn Sie eine Verzögerung benötigen, müssen Sie wahrscheinlich eine Kategorie für NSObject erstellen und eine neue Methode selbst erstellen.

4

Die NSObject-Klasse hat eine performSelector:withObject:afterDelay: Methode und das NSObject Protokoll spezifiziert eine performSelector:withObject:withObject: Methode, aber nirgendwo gibt es eine performSelector:withObject:withObject:afterDelay: angegeben.

In diesem Fall müssen Sie eine NSInvocation verwenden, um die gewünschte Funktionalität zu erhalten. Richten Sie den Aufruf ein, und rufen Sie anschließend mit dem Selektor invoke und einem nil Objekt den Aufruf performSelector:withObject:afterDelay auf.

1

Es ist kein guter Weg, um sie herum zu bekommen, aber wenn man wollte konnte man die Methode ändern Sie eine NSArray zu akzeptieren, wenn das Objekt bei Index 0 ist die Taste und Index 1 ist die Zeichenfolge.

3

Es gibt keine Methode zum Ausführen eines Selektors mit mehreren Argumenten und eine Verzögerung. Sie könnten die Taste und das String-Objekt in einem NSDictionary wickeln, um diese so zu arbeiten:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:A1,@"button",fileString2,@"string",nil]; 
[self performSelector:@selector(changeWithDict:) withObject:dict afterDelay:0.1]; 
//... 

-(void)changeWithDict:(NSDictionary *)dict { 
    [[dict objectForKey:@"button"] setImage:[UIImage imageNamed:[dict objectForKey:@"string"]] forState:UIControlStateNormal]; 
} 
2

Wenn Sie iOS Targeting sind 4.0+ Sie Blöcke nutzen könnten. Etwas in dieser Richtung sollte den Zweck erfüllen.

// Delay execution of my block for 0.1 seconds. 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, USEC_PER_SEC/10ull), dispatch_get_current_queue(), ^{ 
    [self changeImage:A1 withString:fileString2]; 
}); 
+0

Ich werde dies im Hinterkopf behalten, aber ich bin von 3.0 Targeting. – jarryd

+0

In diesem Fall müssen Sie die NSInvocation-Methode verwenden, die von anderen bereitgestellt wird. Blöcke wurden nur in iOS 4.0 eingeführt. – extremeboredom

Verwandte Themen