@selector有多个参数

时间:2010-12-29 15:14:39

标签: iphone objective-c 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];
}

6 个答案:

答案 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:afterDelayinvoke对象在调用本身上调用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创建一个类别并自行创建一个新方法。