1

次のコードが正確にどのように機能するのか疑問に思っています (はい、実際に意図したとおりに機能し、クリックされたボタンに応じてタグの値が異なります) button。他の6つのボタンは残っていますか?このコードを実行した後、本当に 7 秒間メモリが予約されているUIButtonのでしょうか?

または、より一般的な質問として: これは良いプログラミング スタイルですか? 要点は、クリックされたボタンに応じて異なるアクションを実行する必要があるということです。このアプローチ (限られた objc スキルを使用した場合) が最も単純に見えました。よろしくお願いします。初心者の iOS 開発者です。

UIButton *button;
for(int k=0;k<7;k++)
        {
             button = [UIButton buttonWithType:UIButtonTypeCustom];
            [button addTarget:self 
                       action:@selector(aMethod:)
             forControlEvents:UIControlEventTouchUpInside];
            [button setTitle:@"" forState:UIControlStateNormal];
            button.frame = CGRectMake(80, 20+30*k, 30, 30);
            button.backgroundColor=[UIColor clearColor];
            button.tag=k;
            [subview addSubview:button];
        }

関数 aMethod: は次のように定義されます。

-(IBAction)aMethod:(id)sender
{
   UIButton *clickedButton=(UIButton *) sender;
   NSLog(@"Tag is: %d",clickedButton.tag);
}
4

3 に答える 3

1

いいえ、あなたはUIButton7 回を再利用していません: ループの反復ごとUIButtonに、クラス method への呼び出しでの新しいインスタンスを作成しbuttonWithType:、それを同じ名前の変数に割り当てます。

[UIButton buttonWithType:UIButtonTypeCustom];

ループ内でその変数を宣言すると、コードが改善されます。

for(int k=0;k<7;k++)
    {
         UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
         // ...the rest of the loop
    }

これは、ボタンが非常によく似たアクションを実行する状況に適したプログラミング スタイルです。たとえば、電卓ボタンは、挿入する数値のみが異なります。ボタンが大きく異なるアクション (挿入と削除など) を実行する場合は、ループではなく個別に作成し、個別の方法を使用してクリックを処理することをお勧めします。

于 2012-06-06T20:14:25.890 に答える
0

このコードで十分です。7 つの異なるボタンを作成し、それらをサブビューとして追加しています。すると-addSubview:、オブジェクトが配列に追加され、 の.subviewsプロパティを介してアクセスされますUIView

for ループに UIButton *button を追加する必要がありますが。したがって、コードは次のようになります。

for(int k=0;k<7;k++)
    {
         UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
   ....
}

ボタンで for ループを実行する必要がある場合はout、ループの外で宣言するのが理にかなっていますが、これはあなたの場合ではありません。お役に立てれば。

于 2012-06-06T20:17:42.957 に答える
0

このコードでは、異なる位置とタグを持つ 7 つのボタンを作成するだけです。それははるかに優れており、作成コードを 7 回複製します。私が提供できることの1つは、ボタンタグの列挙型を作成して、次のようなコードを防止することです。

switch([button tag])
{
    case 1:
        // do something
        break;
    case 2:
        // do something else
        break;
    case 3:
        // exit
        break;
    .....
    default:
        assert(NO && @"unhandled button tag");
}

列挙値を含むコードははるかに読みやすい

switch([button tag])
{
    case kButtonForDoSomething:
        // do something
        break;
    case kButtonForDoSomethingElse:
        // do something else
        break;
    case kButtonExit:
        // exit
        break;
    .....
    default:
        assert(NO && @"unhandled button tag");
}
于 2012-06-06T20:15:48.987 に答える