实际上,我刚刚(在侧边栏中)发现了这个问题,它建议 subclass NSTableRowView
。我之前已经这样做了,但是没有用。我再次尝试了它,令人惊讶的是它现在可以工作了......
在基于视图的 NSTableView 中处理自定义选择样式
但是,这个答案的信息量不是很大,所以我将尝试介绍我为完成这项工作所做的工作。
首先,我实现了下面的 NSTableView 委托方法并返回 nil!:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
return nil;
}
为了使用基于视图(我猜 NSTableViewRow 也被视为基于视图的表......)表,您必须实现此方法。我不太确定我可能做错了什么,但是如果没有这种方法,我的单元格将不会显示!
确保不要让 NSTableView 通过设置此属性来处理任何选择:
yourNSTableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleNone;
好的,现在我们要使用以下委托方法设置我们的单元格:
-(NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row{
static NSString *cellID = @"cell_identifier";
//use this if you want to reuse the cells
CustomTableRowView *result = [tableView makeViewWithIdentifier:cellID owner:self];
if (result == nil) {
result = [[CustomTableRowView alloc] initWithFrame:NSMakeRect(0, 0, self.frame.size.width, 80)];
result.identifier = cellID;
}
result.data = [tableData objectAtIndex:row];
// Return the result
return result;
}
好的,现在子类NSTableRowView
化并实现/覆盖以下两种方法:
首先,我们必须覆盖setSelected:
以使单元格在被选中时重绘其背景。所以这里是:
-(void)setSelected:(BOOL)selected{
[super setSelected:selected];
[self setNeedsDisplay:YES];
}
如前所述,我们调用setNeedsDisplay:
是为了让单元格重绘其背景。
最后是绘图代码。覆盖这样的方法drawBackgroundInRect:
:
-(void)drawBackgroundInRect:(NSRect)dirtyRect{
if (!self.selected) {
[[NSColor clearColor] set];
} else {
[someColor set];
}
NSRectFill(dirtyRect);
}