将参数传递给Objective-C中的选择器

时间:2013-11-11 15:57:32

标签: ios objective-c

我的功能看起来像这样

-(void) doTransition:(id)sender withID:(int) n

如何将int n传递给选择器

target:self selector:@selector(doTransition:)withID:3

这不起作用

请帮忙 感谢

4 个答案:

答案 0 :(得分:5)

所以,我用谷歌搜索“用参数调用选择器”并得到了一堆结果,第一个是关于SO的问题:Objective-C: Calling selectors with multiple arguments

投票最多的答案有一些细节,具体来说:

[selectorTarget performSelector:mySelector withObject:@3];

这是一项简单的任务。可以在链接的问题/答案区域找到更多信息。

请注意我通过的@3,这不是int,而是NSNumber。如果您有int值,则可以通过执行NSNumber轻松获得[NSNumber numberWithInt:myIntValue]@3是俚语3.4中提供的简写语法,用于创建具有整数值的NSNumber。在此使用NSNumber代替int非常重要,因为此选择器调用需要id类型作为withObject:参数,因此我需要一个对象,而不是一个原语type(编译器是否自动换行,我不能说)。

另一个重要的注意事项是定义了三个performSelector:函数:

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject;

所以你可以看到你可以使用不带值和函数的函数,它们将一个或两个值作为选择器,但除此之外,你很可能需要编写自己的逻辑来调用大于2的arity函数

答案 1 :(得分:4)

简短的回答是你没有。像performSelector:这样的方法被设置为将NSObjects作为参数传递,而不是标量值。

有一个方法performSelector:withObject:withObject:将调用一个带有2个对象参数的方法。

您可以通过创建NSInvocation来触发包含任何类型参数的方法,但这是一项相当多的工作,并且有点难以弄清楚如何去做。

在你的情况下,重构你的方法以将ID参数作为NSNumber对象会更简单。

答案 2 :(得分:0)

您需要传递一个NSDictionary,其中包含您要发送的值,例如:

NSDictionary *myDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:3] forKey:@"myInt"];

答案 3 :(得分:0)

使用NSNumber传递值并不容易,我实现了一种将对象作为int传递的方法。

+ (void)showNotice:(NSString *)str atView:(UIView *)view delay:(int)delay {
    [cc_message cc_instance:CC_Notice.shared method:@selector(showNotice:atView:delay:) params:str,view,Int(delay)];
}

并使用调用来接收并简化为int。

CC_Int *ccint = (CC_Int *)obj;
int value = ccint.value;
[invocation setArgument:&value atIndex:i+2];