Петля, чтобы сделать сетку из NSButtons? - PullRequest
1 голос
/ 19 июля 2011

Я пытаюсь перебрать и программно сделать сетку из 256 NSButtons (16x16). Код, который у меня есть, приведен ниже. Это в Objective-C для моего приложения Mac. Поэтому я регистрируюсь, чтобы увидеть, какой тег я получаю, когда нажимаю кнопку, но он каждый раз возвращает один и тот же тег. Я хочу, чтобы каждая кнопка шла 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);
}

Ответы [ 5 ]

4 голосов
/ 19 июля 2011

Вместо того, чтобы делать все эти кнопки самостоятельно, почему бы не использовать NSMatrix?Это такая вещь, для которой идеально подходит .

1 голос
/ 19 июля 2011

Он возвращает один и тот же тег каждый раз, потому что ваше действие ссылается на вашу (очевидно) переменную-член paintPixel.Вместо этого используйте параметр sender для действия.

NSLog(@"%ld", ((NSButton *)sender).tag);
1 голос
/ 19 июля 2011

Не знаете, как его компилировать, возможно, paintPixel определен в другом месте.Но вам нужно изменить btnPaintAction с:

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

на что-то вроде этого:

-(void)btnPaintAction:(id)sender {
     NSButton * myButton = (NSButton *) sender;
     NSLog(@"%ld", myButton.tag);
}
1 голос
/ 19 июля 2011

вызов setTag с переменной приращения

int TagVal = 1;

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

Затем измените ваш btnPaintAction:

UIButton *button = (UIButton *)sender;
NSLog(@"%ld", button.tag);
0 голосов
/ 03 марта 2012

Это старый пост, но я не вижу правильного ответа, поэтому мое дополнение.

Q. «Я хочу, чтобы каждая кнопка шла 1-256 слева направо, сверху вниз».

Кевин был на хорошей трассе, однако требуется еще одно изменение:

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

Таким образом, минус (-) вместо плюса (+) приводит к нумерации сверху вниз.

...