2010-12-29 27 views
5

複数の引数を持つ@selectorメソッドをどのように呼び出すのですか?複数の引数を持つ@selector

私は、次の

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

を持っていますが、

認識されていないセレクタがインスタンスに送信され得る

エラー

を次のように私は呼び出しています私の方法がある

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

答えて

18

あなたはインデックス0のオブジェクトがボタンで、でたとき、それはそれラウンドを取得するための良い方法ではありませんが、あなたが望むならば、あなたがたNSArrayを受け入れるようにする方法を修正することができNSInvocation

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

ありがとう、ありがとう。どうすればいいですか?私は多くの場所でこれを呼びたいと思っています。だからそれは、viewDidLoadメソッドで宣言され、さまざまな場所で呼び出すことができますか? – jarryd

+0

あなたが何を意味するのか本当に分かりません。このコードは、changeImage:withString:が定義されているクラスのどこにでも配置できます。複数回呼び出す場合は、メソッドにラップしてそのメソッドを呼び出す必要があります。 – Jilouc

+1

代わりに、 '[invocation performSelector:@selector(invoke)withObject:nil afterDelay:0.1];' – user102008

0

performSelector:withObject:withObject:afterDelay:を呼び出していますが、その方法は存在しません。

唯一のオプションはperformSelector:withObject:withObject:ですが、その方法で遅延を指定することはできません。遅延が必要な場合は、おそらくNSObjectのカテゴリを作成し、自分で新しいメソッドを作成する必要があります。

4

NSObjectクラスにはperformSelector:withObject:afterDelay:メソッドがあり、NSObjectプロトコルにはperformSelector:withObject:withObject:メソッドが指定されていますが、performSelector:withObject:withObject:afterDelay:は指定されていません。

この場合、希望の機能を得るにはNSInvocationを使用する必要があります。呼び出しを設定してから、呼び出し側でinvokeセレクタとnilオブジェクトを使用してperformSelector:withObject:afterDelayを呼び出すことができます。

1

を使用する必要がありますインデックス1は文字列です。

3

複数の引数を持つセレクタを実行する方法はありません遅延があります。

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

iOS 4.0+をターゲットにしている場合は、ブロックを使用することができます。これのラインに沿って何かがトリックを行う必要があります。

// 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

を実行することができます。これを念頭に置いていますが、3.0からターゲット設定しています。 – jarryd

+0

その場合、他人が提供するNSInvocationメソッドを使用する必要があります。ブロックはiOS 4.0でのみ導入されました。 – extremeboredom

関連する問題