NSButton被绘制在自定义NSCell中,但实际上不是可点击的

时间:2012-02-28 02:59:23

标签: macos cocoa nstableview nsbutton nscell

我有一个NSTableView,它包含我自定义的NSCell子类,IconCell。

IconCell包含三个元素:图像,文本和按钮。

以下是我的绘图代码的简化版本(closeButton是按钮):

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    NSPoint cellPoint = cellFrame.origin;

    [controlView lockFocus];

    CGFloat buttonWidth = [closeButton frame].size.width;

    [someNSImage drawInRect:NSMakeRect(cellPoint.x, cellPoint.y, ICON_WIDTH, ICON_HEIGHT) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
    [someNSString drawInRect:NSMakeRect(cellPoint.x+ICON_WIDTH+PADDING, cellPoint.y, cellFrame.size.width - ICON_WIDTH - buttonWidth, cellFrame.size.height) withAttributes:someTextAttributes];
    [(NSButtonCell*)[closeButton cell] drawWithFrame:NSMakeRect(cellPoint.x + cellFrame.size.width - buttonWidth, cellPoint.y, buttonWidth, cellFrame.size.height) inView:controlView];

    [controlView unlockFocus];
}

绘图部分工作正常,产生如下内容:

cell screenshot

这就是我想要的。

此外,当用户与单元格交互时,我希望发生以下两种情况之一:如果用户单击单元格上的任何位置,除了关闭按钮外,它应该actionA。如果用户点击关闭按钮,则应该actionB

我遇到的问题是关闭按钮似乎“看不见” - 如果我点击它,它就不会移动(而工作按钮应显示其按下状态),并且通常它表现为如果不存在,则会触发actionA而不是actionB

这是我设置这两个动作的方式:

[tableView setAction:@selector(actionA)];

[closeButton setAction:@selector(actionB)];

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您只是在单元格中绘制按钮的图片。这与将实际按钮放入单元格不同。

单元格不是完整视图,因此这比您最初想象的要复杂得多。如果您真的必须使用单元格,请在此处解释:NSButtonCell inside custom NSCell

但是......如果你可以将自己限制在10.7以上,他们就会添加基于视图的表格视图。这些更简单,因为您可以在NSButton内放置一个完整的NSTableViewCellView。这在Table View Programming Guide中有解释。强烈推荐,如果你可以将自己限制在10.7 +。