0
SEL twoArgumentSelector = @selector(methodWithTwoArguments:and:); 

[newsButton addTarget:self action:@selector(twoArgumentSelector) forControlEvents:UIControlEventTouchUpInside];

-(void)methodWIthTwoArguments:(id)argumentOne and:(id)argumentTwo;

我已经看到了一些示例,它们可以让您在选择器中使用两个参数。在上面的代码中怎么做?提前。

4

4 回答 4

1
@selector(twoArgumentSelector:and:)

虽然我不确定你将如何发送带有控制事件的两个参数......

编辑:

你知道选择器实际上并没有调用方法,所以你不能用选择器传递参数。它基本上只是代码块(方法)的名称。读这个。更好的解决方案是让控制事件调用一个单独的方法,然后该方法可以确定要发送到具有 2 个参数的方法的参数。

于 2012-08-02T04:14:05.453 回答
1

UIControls 事件仅在其目标选择器允许一个参数时才会发送对自身的引用。这就是你所得到的。UIButton 就是这样一种 UIControl 子类。

- (void)buttonAction:(id)sender; //(reference to button)

完成您想要的最简单的方法是在您的按钮目标(在本例中self)上创建另一个方法来调用您的两个参数选择器。

[newsButton addTarget:self action:@selector(buttonAction:) forControlEvents:...];

- (void)buttonAction:(id)sender
{
  [self methodwithTwoArguements:sender and:otherObject];
}

这也可以通过 UIButton 子类来解决,但取决于您需要的第二个参数,这是最简单的方法。

于 2012-08-02T04:18:38.553 回答
0

除非您对对象进行子类化,否则不需要这样做,因为 UIControlEvents 的参数是发送事件的实例的 id。您可以从该实例中获取您可能需要的所有信息。

于 2012-08-02T04:19:07.963 回答
0

您正在寻找的是NSInvocation

这是一个例子:

SEL mySelector; // 2 parameter selector.

// ...

NSMethodSignature *signature = [[MyClass class] instanceMethodSignatureForSelector:mySelector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:myTarget];
[invocation setArgument:arg1 atIndex:0];
[invocation setArgument:arg2 atIndex:1];
[invocation invoke];

这将完全符合您的要求。

然而,值得注意的是,您绑定的控制事件不会为第二个参数传递任何内容。这只有在按照约定,回调的对象实际上有第二个参数要传入时才有效。

于 2012-08-02T04:29:25.227 回答