【问题标题】:Programmatically added subviews in table view not responding to mouse down events以编程方式在表格视图中添加子视图不响应鼠标按下事件
【发布时间】:2012-10-28 17:39:39
【问题描述】:

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

【问题讨论】:

    标签: cocoa nstableview nsview mousedown


    【解决方案1】:

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

    【讨论】:

    • 这似乎更像是一个评论而不是一个答案
    • 我会尝试,但由于我没有使用 NSTableView,我想了解它为什么不起作用..
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2012-05-26
      相关资源
      最近更新 更多