我有一个基于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
。
这里的主要目的是根据某些条件着色整行。上述实施有什么不对?
答案 0 :(得分:37)
对于任何其他人来说,并且想要一个自定义的NSTableRowView backgroundColor,有两种方法。
如果您不需要自定义绘图,只需在rowView.backgroundColor
的{{1}}中设置- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row
。
示例:
NSTableViewDelegate
如果您确实需要自定义绘图,请使用所需的- (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/707921或http://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”中更改。当然,如果你想要背景颜色。