我有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];
}
}
答案 0 :(得分:0)
您是否知道NSTableView将使用NSCell对象进行绘图,而不是NSView?如果没有,请调查NSCell - 使用它来在NSTable中进行自定义绘图是可行的方法。
答案 1 :(得分:0)
我理解了这个问题...因为mouseDown实现会导致块重绘,所以即使是它的superview,它也会调用Table的drawRect:方法,导致它在旧的块之上绘制新的块,所以它似乎永远不会改变颜色。所以我为Table创建了一个名为isFirstAppearance的属性,最初设置为YES,如果YES使表格绘制行并将其自身设置为NO。