web-dev-qa-db-ja.com

IOS:複数のボタンに対して1つのIBAction

私のプロジェクトでは、40個のボタンのアクションを制御する必要がありますが、40個のIBActionを作成したくないのですが、IBActionのみを使用できますか?

36
CrazyDev

インターフェイスビルダーを使用してボタンを作成している場合は、関連するクラスの同じIBActionを指すようにします。

その後、ボタンからテキストを読み取ることにより、IBActionメソッド内のボタンを区別できます。

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"Button pressed: %@", [sender currentTitle]);    
}

...またはXcodeでtagプロパティを設定し、[sender tag]を介してそれを読み取ることにより。 (このアプローチを使用する場合、0がデフォルトであり、したがってほとんど使用されないため、タグを1から開始します。)

56
John Parker
-(IBAction)myButtonAction:(id)sender {
    if ([sender tag] == 0) {
        // do something here
    }
    if ([sender tag] == 1) {
        // Do something here
    }    
}

// in Other words

-(IBAction)myButtonAction:(id)sender {
        switch ([sender tag]) {
        case 0:
            // Do something here
            break;
        case 1:
           // Do something here
             break;
       default:
           NSLog(@"Default Message here");
            break;
}
12
BigAppleBump

その1つのアクションを使用するようにすべてのボタンを設定します。通常、アクションにはsenderパラメーターがあり、これを使用して、どのボタンがアクションを呼び出しているかを判別できます。ボタンの違いを判断する一般的な方法の1つは、各ボタンのtagプロパティに異なる値を割り当てることです。したがって、1〜40の範囲のタグを持つ40個のボタンがあります。(0は、デフォルト値であり、タグを設定するのを忘れたボタンは、タグ値。)

この手法は、電卓やキーボードのボタンなど、すべてのボタンがほぼ同じことを行う場合に最も役立ちます。各ボタンがまったく異なる動作をする場合、40個のメソッドに相当する結果になりますが、Objective-Cのメッセージングシステムの代わりに独自のswitchステートメントを使用します。その場合、必要なだけ多くのアクションを作成するために時間を費やす方が適切な場合が多くあります。

9
Caleb

確かに。 Interface Builderですべてのボタンを同じアクションメソッドに接続するだけです。メソッドのsender引数(おそらくボタンのtagプロパティと組み合わせて)を使用して、イベントを送信しているボタンを特定します。

4
Ole Begemann

上記の方法を自分で使用し、ボタンを選択しましたが、すべてを変換し、代わりにスイッチケースを使用しました

-(IBAction)buttons:(id)sender
{

    switch ([sender tag])

    {

        case 0 :

    }
}
0
clive dancey

1つのIBActionを使用して、それをすべてのボタンに割り当てます。

0
Joris Mans

必要な答えはすべて手に入れているようですが、他の人の答えに加えたいと思います。

1つのIBActionを使用するか、40のアクションを使用するかは、ボタンで何をするかによって決まります。すべてのボタンの機能がまったく異なる場合は、すべての個別のIBActionが必要ですが、すべてのボタンで同じことを実行する場合は、1つだけを使用できます。これらのボタンとアクションの詳細が必要ですが、おそらく各ボタンのタイトルがあるので、それを使用して各ボタンを区別し、押された特定のボタンによってカスタマイズされるメッセージまたは何かを作成できます。以下に例を示します。ボタンを押すたびに、ラベルには「ボタンのタイトル」というメッセージが表示されます。

このようにすることで、40パターンすべてで大文字と小文字を切り替える必要がなくなります。わずか2〜3行のコードでボタンを押すことで個別化された何かを表示または実行できます。

- (IBAction)button_Clicked:(UIButton *)sender {

    //Get the buttons' titles.
    NSString *title =[sender titleForState:UIControlStateNormal];

    //Construct a message that includes the *title. 
    NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];

    //Assigns the *plainText to the label. 
    self.Label.text=plainText;

}
@end
0
misatota