2

メイン ストーリーボードに一連の IB アクションがあり、すべてテキスト ラベルの上のボタンによってトリガーされます。ボタン 1 をタップすると、ラベル 1 のコードが実行され、ボタン 2 をタップすると、ラベル 2 のコードが実行されます。

IBAction ごとにほぼ同じコードを書き出すと、何か間違ったことをしていることがわかります。ActionScript では (昔のことです!) 関数を記述し、各ボタンとラベルのインスタンス名を参照するだけでした。

以下のコードの簡略化されたセグメントを含めました。うまく機能しています。効率的にしたいだけですが、Xcodeでこれを行う方法がわかりません。助けてくれてありがとう!

- (IBAction)firstBtnPressed {

    self.firstLabel.text = rightNow;

}

- (IBAction)secondBtnPressed {

    self.secondLabel.text = rightNow;

}
4

3 に答える 3

3

あなたの実装はまったく問題ありません。必要UIButtonに応じて、IB で 'sa タグ値を指定してから、メソッドを組み合わせることができます (両方のアクションを同じメソッドに設定します)。

- (IBAction)buttonPressed:(UIButton *)button {
    if (button.tag == 0) {
        self.firstLabel.text = rightNow;
    } else if (button.tag == 1) {
        self.secondLabel.text = rightNow;
    }
}

スイッチを使用することもできます。

switch (button.tag) {
    case 0:
        self.firstLabel.text = rightNow;
        break;
    case 1:
        self.secondLabel.text = rightNow;
        break;      
    default:
        break;
}

これがあなたが求めているものだと思います。私が何かを誤解した場合は、私に知らせてください。

編集:

あなたがこれらのうちの9つを持っていることを考えると、私は個人的に私のアプローチを少し変えます. それらをすべて配列に入れてアクセスすることもできます[self.myLabels[button.tag] setText:rightNow];が、それでも 9 つの IBOutlets が必要です。問題はありませんが、たくさんあります。

もう 1 つの方法は、対応するボタンより 20 ポイント高いタグをすべてのボタンに付けて、IBAction 内で次のようにすることです。

UIView *viewToChange = [self.view viewWithTag:button.tag+20];
// used to protect yourself since IB allows the multiple views to have the same tag
if ([viewToChange isKindOfClass:[UILabel class]]) {
    ((UILabel *)viewToChange).text = rightNow;
}

これは単純ですが、ボタンとラベルの両方のタグ値にロジックをしっかりとバインドします。これの利点は単純なロジックであり、すべての UILabel に対して IBOutlets がありません!

于 2013-10-30T18:13:17.900 に答える
1

各 UIButton をプロパティとして追加し、どれが押されているかを確認できます。

- (IBAction)tappedButton:(id)sender {

    if ( sender == _button1){

        NSLog(@"Button 1 pressed");
    }
    //....
}

アクションアウトレットを接続する際に、引数として「sender」を選択する必要があります。これで、すべてのボタンを同じコンセントに接続できます。

于 2013-10-30T18:19:48.880 に答える