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

5
我的函数长这样
-(void) doTransition:(id)sender withID:(int) n

如何将 int n 传递给选择器:
target:self selector:@selector(doTransition:)withID:3

这样做不起作用

请帮忙 谢谢


你可以发送一个包含所有所需属性的NSDictionary实例 :) 然后你的函数将会是 -doTransition:(NSDictionary*)info - Neil Galiaskarov
4个回答

6

所以,我谷歌了一下“带参数调用选择器”,得到了许多结果,其中第一个是SO上的一个问题:Objective-C: Calling selectors with multiple arguments

那里得票最高的回答有一些细节,具体如下:

[selectorTarget performSelector:mySelector withObject:@3];

这是一个简单的任务。更多信息可以在链接的问题/答案区找到。
注意我传递的@3,它不是一个int而是一个NSNumber。如果你有一个int值,你可以通过执行[NSNumber numberWithInt:myIntValue]轻松地获得一个NSNumber。在clang 3.4中提供了@3的速记语法,用于创建具有整数值的NSNumber。这里使用NSNumber而不是int非常重要,因为此选择器调用期望withObject:参数作为id类型,因此我需要一个对象,而不是原始类型(编译器是否自动包装,我无法确定)。
另一个重要的注意事项是定义了三个performSelector:函数:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject;

因此,您可以使用不带值的函数和带一个或两个值的函数作为选择器,但除此之外,您很可能需要编写自己的逻辑来调用具有大于2的参数数量的函数。


你可以使用NSInvocation来调用带有超过2个参数或返回值的选择器,而不是“编写自己的逻辑来调用函数”。 - Geraud.ch
@Geraud.ch 如果我理解有误,请纠正我,但这难道不符合“编写自己的逻辑”的条件吗?这意味着您可以使用任何可用的工具来实现它,但它并不像performSelector:函数一样附加在对象上供您使用。 - Brandon Buck
我认为你想要说的是:将带有参数的方法包装在另一个方法中,这样您就可以使用相同的performSelector。目标是向NSInvocation添加指针,而不是与您意见不合 :) - Geraud.ch
@izuriel,看起来你和我在短时间内几乎同时发布了相同的答案。我猜你是在我撰写我的答案时发布了你的答案。 - Duncan C
@DuncanC 这种情况经常发生,我已经为你的答案点了赞。 - Brandon Buck
显示剩余2条评论

5
简短回答是不行的。像performSelector:这样的方法是设置为传递NSObjects作为参数,而不是标量值。
有一种方法performSelector:withObject:withObject:将调用具有2个对象参数的方法。
您可以通过创建NSInvocation来触发任何类型的参数的方法,但这需要相当多的工作,并且有点棘手,需要弄清楚如何做到这一点。
在您的情况下,将ID参数重构为NSNumber对象会更简单。

是的,它必须是一个对象。 - user2735868

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

使用调用方法接收并将其转换为整数。

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

这也解决了performSelector:最多只能传递2个对象的问题。它可以传递任意多个对象。 - Gao

-1

你需要传递一个包含你想要发送的值的NSDictionary,类似于:

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

1
我不明白将值包装在字典中如何解决“如何将此值传递给选择器?”的问题,因为没有展示出该人知道传递对象所需的函数的代码。 - Brandon Buck

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