1. ホーム
  2. ios

[解決済み] addTarget:action:forControlEventsへのパラメータの渡し方

2022-07-24 23:34:43

質問

addTarget:action:forControlEventsをこのように使用しています。

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

で、セレクタの "switchToNewsDetails" にパラメータを渡したいのですが、どうすればいいでしょうか? 唯一成功するのは、(id)senderを記述して渡すことです。

action:@selector(switchToNewsDetails:)

しかし、私は整数のような変数を渡そうとしています。このように書くとうまくいきません.

int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];

このように書いてもうまくいきません。

int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];

どんな助けでも感謝します :)

どのように解決するのですか?

action:@selector(switchToNewsDetails:)

にはパラメータを渡さない。 switchToNewsDetails: メソッドにパラメータを渡すことはありません。特定のアクションが発生したとき(あなたのケースではタッチアップ)、ボタンがそれを呼び出すことができるようにするためにセレクタを作成するだけです。コントロールはアクションに応答するために3種類のセレクタを使用することができ、それらのすべては、それらのパラメータの事前定義された意味を持っています。

  1. パラメータなし

    action:@selector(switchToNewsDetails)
    
    
  2. メッセージを送信するコントロールを示す1つのパラメータを持つ

    action:@selector(switchToNewsDetails:)
    
    
  3. メッセージを送信するコントロールと、そのメッセージをトリガーしたイベントを示す2つのパラメータを持つ。

    action:@selector(switchToNewsDetails:event:)
    
    

具体的に何をしようとしているのか不明ですが、各ボタンに特定の詳細インデックスを割り当てることを考えると、次のようにすることができます。

  1. 各ボタンに、必要なインデックスと等しいタグのプロパティを設定する。
  2. switchToNewsDetails: メソッドで、そのインデックスを取得し、適切なデータを開くことができます。

    - (void)switchToNewsDetails:(UIButton*)sender{
        [self openDetails:sender.tag];
        // Or place opening logic right here
    }