以编程方式在表视图中添加子视图不响应鼠标按下事件

时间:2012-10-28 17:39:40

标签: cocoa nstableview nsview mousedown

我有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];
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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