多参数的@selector

5
如何调用带有多个参数的@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个回答

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];

好的,谢谢。我该怎么调用它呢?我想在很多地方调用它。所以它可以在viewDidLoad方法中声明,然后在各个地方调用吗? - some_id
我不太明白你的意思。你可以把这段代码放在定义了changeImage:withString:方法的类中的任何位置。如果你想要调用它多次,你应该将其包装在一个方法中,并调用该方法。 - Jilouc
1
你可以选择使用 [invocation performSelector:@selector(invoke) withObject:nil afterDelay:0.1]; - user102008

4
NSObject类有一个`performSelector:withObject:afterDelay:`方法,NSObject协议指定了一个`performSelector:withObject:withObject:`方法,但是没有指定一个`performSelector:withObject:withObject:afterDelay:`方法。
在这种情况下,您需要使用NSInvocation来获得所需的功能。设置调用,然后您可以在调用本身上调用`performSelector:withObject:afterDelay`,使用选择器`invoke`和一个`nil`对象。

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];
}

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];
});

在这种情况下,您需要使用其他人提供的NSInvocation方法。块是在iOS 4.0中引入的。 - extremeboredom

1

这不是一个好的方法,但如果你想的话,你可以修改这个方法来接受一个NSArray,其中索引0的对象是按钮,索引1的对象是字符串。


0

您正在调用performSelector:withObject:withObject:afterDelay:,但该方法不存在。

您唯一的选择是performSelector:withObject:withObject:,但是您无法使用该方法指定延迟。如果您需要延迟,可能需要为NSObject创建一个类别,并自己创建一个新方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接