【问题标题】:Passing arguments to selector in Objective-C在 Objective-C 中将参数传递给选择器
【发布时间】:2013-11-11 15:57:32
【问题描述】:

我的函数是这样的

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

如何将 int n 传递给选择器,

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

这行不通

请帮忙 谢谢

【问题讨论】:

  • 您可以发送具有您需要的所有属性的 NSDictionary 实例 :) 然后您的函数将类似于 -doTransition:(NSDictionary*)info

标签: ios objective-c


【解决方案1】:

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

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

[selectorTarget performSelector:mySelector withObject:@3];

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

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

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

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

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

【讨论】:

  • 除了“为调用函数编写自己的逻辑”之外,您还可以使用 NSInvocation 调用具有超过 2 个参数的选择器或返回某些内容的选择器。
  • @Geraud.ch 如果我错了,请纠正我,但这不符合“编写自己的逻辑”的条件吗?这意味着您可以使用您拥有的任何工具来执行此操作,但它不是像 performSelector: 函数那样附加到对象的可用工具。
  • 我以为您想说:将您的方法与参数包装在另一个方法中,以便您可以使用相同的 performSelector。目标是添加一个指向 NSInvocation 的指针,而不是不同意你:)
  • @Geraud.ch 啊,我明白了。老实说,我对NSInvocation 不太熟悉,无法将其作为建议提供,我只是避免提及它,因为它在 cmets 和另一个答案中也提到过。虽然这是一个很好的研究点。
  • 谢谢,很有帮助
【解决方案2】:

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

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

您可以通过创建 NSInvocation 来触发具有任何类型参数的方法,但这需要大量工作,而且要弄清楚如何去做也有点棘手。

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

【讨论】:

  • 是的,它必须是一个对象
【解决方案3】:

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

【讨论】:

  • 这也解决了 performSelector: can only pass 2 (as max) objects。它可以传递任意数量的对象。
【解决方案4】:

您需要传递一个带有您要发送的值的 NSDictionary,例如:

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

【讨论】:

  • 我看不到将值包装在字典中如何解决“如何将这个值传递给选择器?”中的问题。没有代码表明该人知道传递对象所需的功能。
猜你喜欢
  • 2012-08-31
  • 2017-09-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多