0

我有 3 个子类:一个 Block 类、一个 Row 类和一个 Table 类。都是 NSView 的子类。
我有一个用 IB 添加的表格,它以编程方式显示 8 行,每行显示 8 个块。我覆盖了 Block 中的 mouseDown: 方法以将背景颜色更改为红色,但它不起作用。不过,如果我使用 IB 直接在表格顶部添加一个块,它确实可以工作,所以我不明白为什么它在第一种情况下不起作用。

下面是 Block 和 Row 的实现代码(Table 的实现与 Row 的实现方式相同):

//block.m

- (void)drawRect:(NSRect)dirtyRect
{
    [color set];
    [NSBezierPath fillRect:dirtyRect];
}

-(void)mouseDown:(NSEvent *)theEvent
{
    color = [NSColor redColor];
    checked = YES;
    [self setNeedsDisplay:YES];
}

//row.m

- (void)drawRect:(NSRect)dirtyRect
{

    [[NSColor blueColor] set];
    [NSBezierPath fillRect:dirtyRect];
    int x;
    for(x=0; x<8; x++){
    int margin = x*2;
    NSRect rect = NSMakeRect(0, 50*x+margin, 50, 50);
    Block *block = [[Block alloc] initWithFrame:rect];
    [self addSubview:block];
    }
}
4

2 回答 2

0

您是否知道 NSTableView 将使用 NSCell 对象进行绘图,而不是 NSView?如果没有,请调查 NSCell - 使用它在 NSTable 中进行自定义绘图是可行的方法。

于 2012-10-29T04:58:14.580 回答
0

我理解了这个问题......因为 mouseDown 实现会导致块重绘,所以即使是它的超级视图,它也会调用 Table 的 drawRect: 方法,导致它在旧块之上绘制新块,所以它似乎永远不会改变颜色。所以我为表创建了一个名为 isFirstAppearance 的属性,最初设置为 YES,如果是,则表绘制行并将自身设置为 NO。

于 2012-10-29T15:52:48.167 回答