0

可能重复:
@selector 中的参数

这可能是一个非常简单的问题,但我需要一个非常好的答案......

使用以下代码,我可以在单击按钮时调用方法...

[pushButton addTarget:self action:@selector(pushOrPull:andVI:) forControlEvents:UIControlEventTouchUpInside];
[pullButton addTarget:self action:@selector(pushOrPull:andVI:) forControlEvents:UIControlEventTouchUpInside];

方法如下...

-(void) pushOrPull: (int)pushPull andVI: (NSString *) videoId {

}

我希望按钮能够为该方法提供参数,但是当我尝试这个时......

[pushButton addTarget:self action:@selector(pushOrPull:2 andVI:@"someVID") forControlEvents:UIControlEventTouchUpInside];
[pullButton addTarget:self action:@selector(pushOrPull:1 andVI:@"someVID") forControlEvents:UIControlEventTouchUpInside];

Xcode 给了我两个错误:“expected )”

当我的按钮被点击时,如何向该方法提供这两个参数?

4

4 回答 4

1

不幸的是,你不能。按钮只“知道如何”将自己作为第一个参数发送。最好的办法是让按钮“属于”某个可以解释按钮按下的视图控制器(它们向其发送事件),然后在其他地方调用委托方法,并根据需要使用尽可能多的参数。

要回答相关问题,“选择器”从不携带实际参数,但每个参数确实带有一个冒号:@selector(aMethodWithThis:andThat:)

于 2012-07-17T15:22:04.117 回答
1

你能做的只是中间有一个方法。

[pushButton addTarget:self action:@selector(runMyMethod) forControlEvents:UIControlEventTouchUpInside];
pushButton.tag =0;
[pullButton addTarget:self action:@selector(runMyMethod) forControlEvents:UIControlEventTouchUpInside];
pullbutton.tag =1;

-(void) runMyMethod:(id)sender {
    if(sender.tag ==0)
    {
       [self pushOrPull:1 andVI:@"someVID"];
    }
    else if (sender.tag ==1)
    {
       [self pushOrPull:2 andVI:@"someVID"];
    }
}
-(void) pushOrPull: (int)pushPull andVI: (NSString *) videoId {

}
于 2012-07-17T15:24:26.510 回答
0

这有点好:

// set up an NSMutableDictionary, videoIDsForButtons as an iVar or property
[pushButton addTarget:self action:@selector(buttonWasPressed:) forControlEvents:UIControlEventTouchUpInside];
[videoIDsForButtons setObject: @"someVID" forKey: pushButton];

[pullButton addTarget:self action:@selector(buttonWasPressed:) forControlEvents:UIControlEventTouchUpInside];
[videoIDsForButtons setObject: @"someVID" forKey: pullButton];

 

- (void)buttonWasPressed:(id)sender
{
    if (sender == pushButton)
    {
        [self pushOrPull: 2 andVI: [videoIDsForButtons objectForKey: sender]];
    }
    else // assume pullButton
    {
        [self pushOrPull: 1 andVI: [videoIDsForButtons objectForKey: sender]];
    }
}

这是因为选择器不带参数,只有方法调用可以。当一个按钮被按下时,它提供自己作为唯一的参数 ( sender)。您应该有一个完全独立的响应者方法来查看发送者并确定适当的追索权。

于 2012-07-17T15:27:00.870 回答
0

不幸的是,-addTarget:action:forControlEvents:可以通过以下方法仅使用下一个参数回叫您:

-(IBAction)selector:(id)sender forEvent:(UIEvent *)event;

sender所以,你应该在这个-pushOrPull:andVI:方法里面检查哪个对象触发了事件(不必检查sender参数,只需-pushOrPull:andVI: 像这样调用你:

{
    // ...

    [pushButton addTarget:self action:@selector(pushButtonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside];
    [pullButton addTarget:self action:@selector(pullButtonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside];

    // ...

}

- (IBAction)pushButtonTouchedUpInside:(id)sender {
    [self pushOrPull:2 andVI:@"someVID"];
}

- (IBAction)pullButtonTouchedUpInside:(id)sender {
    [self pushOrPull:1 andVI:@"someVID"];
}
于 2012-07-17T15:40:48.243 回答