如何使用多个参数调用@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];
}
答案 0 :(得分:18)
您应该使用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];
答案 1 :(得分:4)
NSObject类有performSelector:withObject:afterDelay:
方法,NSObject协议指定performSelector:withObject:withObject:
方法,但没有指定performSelector:withObject:withObject:afterDelay:
。
在这种情况下,您必须使用NSInvocation来获得所需的功能。设置调用,然后您可以使用选择器performSelector:withObject:afterDelay
和invoke
对象在调用本身上调用nil
。
答案 2 :(得分:3)
没有方法可以执行具有多个参数和延迟的选择器。您可以将按钮和字符串对象包装在NSDictionary中,以解决此问题:
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];
}
答案 3 :(得分: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];
});
答案 4 :(得分:1)
这不是一个很好的方法来绕过它,但是如果你想要你可以修改方法来接受NSArray,当索引0的对象是按钮而索引1是字符串。
答案 5 :(得分:0)
您正在呼叫performSelector:withObject:withObject:afterDelay:
,但该方法不存在。
您唯一的选择是performSelector:withObject:withObject:
,但您无法使用该方法指定延迟。如果您需要延迟,则可能需要为NSObject
创建一个类别并自行创建一个新方法。