Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Objective-C@Selector(带参数的方法)_Iphone_Objective C_Ios - Fatal编程技术网

Iphone Objective-C@Selector(带参数的方法)

Iphone Objective-C@Selector(带参数的方法),iphone,objective-c,ios,Iphone,Objective C,Ios,可能重复: 这可能是一个非常简单的问题,但我需要一个非常好的答案 使用下面的代码,我可以在单击按钮时调用一个方法 [pushButton addTarget:self action:@selector(pushOrPull:andVI:) forControlEvents:UIControlEventTouchUpInside]; [pullButton addTarget:self action:@selector(pushOrPull:andVI:) forControlEvents:UI

可能重复:

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

使用下面的代码,我可以在单击按钮时调用一个方法

[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给了我两个错误:“预期的”


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

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


回答一个相关的问题,“选择器”从不携带实际的参数,但它每一个参数都带有一个冒号:@选择器(ApthoDouth: and:):/P> < P>你可以做的只是在中间有一个方法。

[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 {

}
这有点好:

// 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];


这是因为选择器不接受参数,只有方法调用接受参数。当按下按钮时,它将自身作为唯一的参数(
sender
)。您应该有一个完整的单独的响应者方法来查看发送者并确定适当的追索权。

不幸的是,
-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"];
}

@Almo No这不是一个重复按钮不能计时!我不知道用户何时会点击一个按钮?选择器不是这样工作的:-)我有没有办法在点击按钮时调用一个方法(带参数)?Shane在这里的回答()不能解决你的问题吗?你不能使用NSInvokation?这是被骗的重要部分;不是计时器。如果我错了,那么我道歉。谢谢,但问题是:在调用选择器方法之前,我可以这样做吗。。。按钮.videoID=@“someVID”。。。。然后在按钮加压法中引用它?啊。嗯,你可以对按钮进行子类化,但这有点过分。我会提供一个替代,如果我的样品。对不起,没有我有像20个按钮和拉按钮。。。当我创建一个表视图时,我正在创建选择器…或者它仍然可以工作???你真的必须重新考虑你的数据设置,因为选择器根本不是那样工作的。
{
    // ...

    [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"];
}