Objective c 以最简单的方式为@selector传递2个参数
我已经看到一些示例,它们允许您在选择器中使用两个参数。在上面的代码中,任何人如何做到这一点?提前打电话Objective c 以最简单的方式为@selector传递2个参数,objective-c,ios,Objective C,Ios,我已经看到一些示例,它们允许您在选择器中使用两个参数。在上面的代码中,任何人如何做到这一点?提前打电话 SEL twoArgumentSelector = @selector(methodWithTwoArguments:and:); [newsButton addTarget:self action:@selector(twoArgumentSelector) forControlEvents:UIControlEventTouchUpInside]; -(void)methodWIth
SEL twoArgumentSelector = @selector(methodWithTwoArguments:and:);
[newsButton addTarget:self action:@selector(twoArgumentSelector) forControlEvents:UIControlEventTouchUpInside];
-(void)methodWIthTwoArguments:(id)argumentOne and:(id)argumentTwo;
虽然我不确定如何发送带有控件事件的两个参数
编辑:
您知道选择器实际上并没有调用该方法,因此无法将参数与选择器一起传递。它基本上只是一个代码块(方法)的名称。阅读更好的解决方案是让控件事件调用一个单独的方法,然后该方法可以确定要发送给该方法的参数,该方法有两个参数 uicontrol的事件将仅在其目标选择器允许一个参数的情况下向其自身发送引用。这就是你能得到的。UIButton就是这样一个子类
@selector(twoArgumentSelector:and:)
实现所需功能的最简单方法是在按钮目标(在本例中为self
)上创建另一个调用双参数选择器的方法
- (void)buttonAction:(id)sender; //(reference to button)
这也可以通过UIButton子类来解决,但根据第二个参数的需要,这是最简单的方法 除非您正在子类化对象,否则不需要这样做,因为uicontrol事件的参数是发送事件的实例的id。您可以从该实例中获得可能需要的所有信息 你要找的是 下面是一个例子:
[newsButton addTarget:self action:@selector(buttonAction:) forControlEvents:...];
- (void)buttonAction:(id)sender
{
[self methodwithTwoArguements:sender and:otherObject];
}
这正是你想要的
但是,值得注意的是,您绑定到的控件事件不会为第二个参数传递任何内容。根据约定,只有当调用的对象实际上有第二个参数要传入时,这才有效。我认为它不会按您希望的方式工作-除非您有newsButton子类,并且您正在自定义操作序列。我只是想知道and:(id)参数两次传入并返回的是什么。我觉得Argument1和Argument2是一样的。所以我想知道他们之间的区别。这不正是OP在这个问题上的区别吗
@selector(methodWithTwoArguments:and:)
是的,我现在同样感到困惑,因为OP写了@selector(twoArgumentSelector)
,这是。。。好吧,错了。我写它的方式是如何使方法成为选择器。虽然在这种情况下它甚至不起作用,因为该方法期望一个只接受一个参数的选择器UIControl
不允许您将NSInvocation
设置为对控制事件的响应。我知道。我在我的帖子中提到了这一点。UIControl事件无需以任何方式将两个参数传递到其事件处理程序中。我刚才提供了一个示例,说明如何编写一个方法,该方法接受目标和选择器,并使用>1参数调用它们。
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];