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

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

问:“我希望每个按钮从左到右,从上到下都是 1-256。”

凯文在良好的轨道上,但是还需要进行另一项更改:

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

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

于 2012-03-03T17:48:55.867 回答