我的功能看起来像这样
-(void) doTransition:(id)sender withID:(int) n
如何将int n传递给选择器
target:self selector:@selector(doTransition:)withID:3
这不起作用
请帮忙 感谢
答案 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];