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 )」という2 つのエラーが表示されます。

ボタンがタップされたときに、これら 2 つの引数をメソッドに指定するにはどうすればよいですか?

4

4 に答える 4

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 に答える
1

残念ながら、できません。ボタンは、最初の引数として自分自身を送信する方法を知っているだけです。最善の策は、ボタンの押下を解釈できるビュー コントローラー (イベントの送信先) にボタンを "所属" させ、必要な数の引数を指定して別の場所でデリゲート メソッドを呼び出すことです。

関連する質問に答えるために、「セレクター」は実際の引数を持ちませんが、引数ごとに 1 つのコロンを持ちます: @selector(aMethodWithThis:andThat:)

于 2012-07-17T15:22:04.117 に答える
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:メソッドを呼び出すか、2 つの異なるコールバック メソッドを設定することもできます。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 に答える