在基于视图的NSTableview中着色行

时间:2012-06-06 08:34:46

标签: cocoa nstableview

我有一个基于nstableview的视图。我想根据我使用下面代码的一些条件为整行着色

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{
    NSTableRowView *view = [[NSTableRowView alloc] initWithFrame:NSMakeRect(1, 1, 100, 50)];

    [view setBackgroundColor:[NSColor redColor]];
    return view;;
}

调用委托方法,但表似乎没有使用委托方法返回的NSTableRowView

这里的主要目的是根据某些条件着色整行。上述实施有什么不对?

4 个答案:

答案 0 :(得分:37)

对于任何其他人来说,并且想要一个自定义的NSTableRowView backgroundColor,有两种方法。

  1. 如果您不需要自定义绘图,只需在rowView.backgroundColor的{​​{1}}中设置- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row

    示例:

    NSTableViewDelegate
  2. 如果您确实需要自定义绘图,请使用所需的- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row { rowView.backgroundColor = [NSColor redColor]; } 创建自己的NSTableRowView子类。然后,在drawRect

    中实施以下内容

    示例:

    NSTableViewDelegate

答案 1 :(得分:1)

最后它的工作原理如下

    - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

{
        NSView *cellView = (NSView*) [tableView makeViewWithIdentifier:[tableColumn identifier] owner:[tableView delegate]];
        CALayer *viewLayer = [CALayer layer];
        [viewLayer setBackgroundColor:[[NSColor redcolor] CGColor]];
        [cellView setWantsLayer:YES]; 
        [cellView setLayer:viewLayer];
        return cellView;
    }

请注意..你需要将nscolor转换为cgcolor,你可以在https://gist.github.com/707921http://forrst.com/posts/CGColor_Additions_for_NSColor-1eW

找到它

答案 2 :(得分:0)

如果您在WWDC 2011中观看基于视图的桌面视图的演示文稿,您将看到主要思想是在Interface Builder中创建视图,然后从那里获取它们。类似的东西:

[tableView makeViewWithIdentifier:@"GroupRow" owner:self];

获得视图后,只需设置其属性并将其返回。

请注意,在此示例中,它有自己的标识符,因此请记住设置它,但您也可以使用自动标识符。

我不知道到WWDC的直接链接是否有效,但主页面在这里:https://developer.apple.com/videos/wwdc/2011/如果您搜索“基于View的NSTableView Basic到高级”,您将找到它。非常值得一看。

答案 3 :(得分:0)

我重新编写了图层方法。 在Swift 3.2中

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

    let greenCell = self.tableview.make(withIdentifier: "green", owner: self)
    let layer:CALayer = CALayer()
    layer.backgroundColor = NSColor.green.cgColor

    greenCell?.wantsLayer = true
    greenCell?.layer = layer

    return greenCell

}
  

不要忘记根据故事板更改单元格的标识符,并在代码标识符“green”中更改。当然,如果你想要背景颜色。