循环制作NSButtons的网格?

时间:2011-07-19 18:36:12

标签: objective-c macos loops tags nsbutton

我试图循环并以编程方式制作256个NSButtons(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);
}

5 个答案:

答案 0 :(得分:4)

为什么不使用NSMatrix而不是自己制作所有这些按钮?这就是完美的

答案 1 :(得分: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);

答案 2 :(得分:1)

不确定如何编译,你可能在别处定义 paintPixel 。但您需要更改 btnPaintAction

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

对于这样的事情:

-(void)btnPaintAction:(id)sender {
     NSButton * myButton = (NSButton *) sender;
     NSLog(@"%ld", myButton.tag);
}

答案 3 :(得分:1)

每次返回相同的标记,因为您的操作是指您的(显然)成员变量paintPixel。请改为使用sender参数。

NSLog(@"%ld", ((NSButton *)sender).tag);

答案 4 :(得分:0)

这是旧帖,但我看不到正确答案,因此我的补充。

Q值。 “我希望它能让每个按钮从左到右,从上到下依次为1-256。”

Kevin处于良好的轨道上,但还需要进行一次改动:

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

因此,减号( - )而不是加号(+)会导致从上到下的编号。