1

ループして、プログラムで256個のNSButton(16x16)のグリッドを作成しようとしています。私がこれまでに持っているコードは以下の通りです。これは私のMacアプリのObjective-Cにあります。そのため、ボタンをクリックしたときに取得するタグを確認するためにログに記録していますが、毎回同じタグが返され続けます。

すべてのボタンが左から右、上から下に1〜256になるようにします。このコードはそれらを私のビューに正常にロードしますが、タグは間違っています。

    #define N_ROWS  16
    #define N_COLS  16
    int btnSpaceDifference = 1;
    int btnSpacing = N_ROWS + btnSpaceDifference;

    for (int j = 0; j < N_ROWS; j++) {

        for (int i = 0; i < N_COLS; i++) {
            paintPixel = [[[NSButton alloc] initWithFrame:NSMakeRect(10 + (i * btnSpacing), 10 + (j * btnSpacing), 16, 16)] autorelease];
            [paintPixel setTitle:@""];
            [paintPixel setBezelStyle:NSBorderlessWindowMask];
            [paintPixel setTag:j + i * N_ROWS + 1];
            [paintPixel setAction:@selector(btnPaintAction:)];
            [[[box.tabViewItems objectAtIndex:0]view] addSubview:paintPixel];
        }
    }

-(void)btnPaintAction:(id)sender{
    NSLog(@"%ld", paintPixel.tag);
}
4

5 に答える 5

4

これらのボタンをすべて自分で作成する代わりに、?を使用してみませんNSMatrixか?これは、それが最適な種類のものです。

于 2011-07-19T19:12:54.600 に答える
1

アクションが(明らかに)メンバー変数を参照しているため、毎回同じタグが返されますpaintPixelsender代わりに、アクションのパラメーターを使用してください。

NSLog(@"%ld", ((NSButton *)sender).tag);
于 2011-07-19T19:18:16.453 に答える
1

setTag増分変数を使用して呼び出す

int TagVal = 1;

for (int j = 0; j < N_ROWS; j++) {
    ....
    [paintPixel setTag:TagVal++];
    ....
}

次に、btnPaintActionを変更します。

UIButton *button = (UIButton *)sender;
NSLog(@"%ld", button.tag);
于 2011-07-19T18:41:05.693 に答える
1

コンパイル方法がわからない場合は、paintPixelを他の場所で定義している可能性があります。ただし、 btnPaintActionを次のように変更する必要があります。

-(void)btnPaintAction:(id)sender {
     NSLog(@"%ld", paintPixel.tag);
}

このようなものに:

-(void)btnPaintAction:(id)sender {
     NSButton * myButton = (NSButton *) sender;
     NSLog(@"%ld", myButton.tag);
}
于 2011-07-19T18:59:07.620 に答える
0

これは古い投稿ですが、正解が見当たらないので、追加しました。

Q.「すべてのボタンが左から右、上から下に1〜256になるようにしたいと思います。」

ケビンは順調に進んでいましたが、もう1つ変更が必要です。

paintPixel = [[[NSButton alloc] initWithFrame:NSMakeRect(10 + (i * btnSpacing), 10 - (j * btnSpacing), 16, 16)] autorelease];

したがって、プラス(+)の代わりにマイナス(-)を使用すると、上から下に番号が付けられます。

于 2012-03-03T17:48:55.867 に答える