我正在尝试在选择表格行时实现自定义行颜色。
-(void)tableViewSelectionDidChange:(NSNotification *)notification{
NSInteger selectedRow = [_mainTable selectedRow];
NSTableCellView *cell = [_mainTable rowViewAtRow:selectedRow makeIfNecessary:NO];
cell.layer.backgroundColor = [NSColor redColor].CGColor;
NSLog(@"selected");
}
但这不起作用。我发现Apple文档很混乱(也许我错了)。我对Mac编程没有经验。
有人可以建议任何解决方案吗?基本上我需要选择颜色是透明的。
答案 0 :(得分:11)
解决方案
这应该通过继承NSTableRowView
然后使用NSTableView
委托方法返回子类来完成
-(NSTableRowView*)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
在修改行视图时,子类NSTableRowView
提供了更大的灵活性。在上面的NSTableView
委托方法中返回您的子类
当从一行到另一行单击时,也会自动删除背景选择颜色(这是在提供的其他答案中的一个未解决的问题)。
步骤
首先,子类NSTableRowView
并覆盖drawSelectionInRect
以在选中时更改其背景颜色:
@implementation MyTableRowView
- (void)drawSelectionInRect:(NSRect)dirtyRect
{
[super drawSelectionInRect:dirtyRect];
[[NSColor yellowColor] setFill];
NSRectFill(dirtyRect);
}
接下来,使用rowViewForRow
NSTableView
委托方法返回您的子类行视图:
- (NSTableRowView*)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
{
static NSString* const kRowIdentifier = @"MyTableRow";
MyTableRowView* myRowView = [tableView makeViewWithIdentifier:kRowIdentifier owner:self];
if (!myRowView) {
myRowView = [[MyTableRowView alloc] initWithFrame:NSZeroRect];
myRowView.identifier = kRowIdentifier;
}
return rowView;
}
使用此方法,您还可以轻松覆盖其他元素,如分隔符颜色。为此,请覆盖drawSeparatorInRect
子类中的NSTableRowView
方法,如下所示:
- (void)drawSeparatorInRect:(NSRect)dirtyRect
{
// Change the separator color if the row is selected
if (self.isSelected) [[NSColor orangeColor] setFill];
else [[NSColor grayColor] setFill];
// Fill the seperator
dirtyRect.origin.y = dirtyRect.size.height - 1.0;
dirtyRect.size.height = 1.0;
NSRectFill(dirtyRect);
}
<强>资源强>
覆盖NSTableRowView
显示设置
https://developer.apple.com/reference/appkit/nstablerowview
NSTableview rowViewForRow
委托方法
https://developer.apple.com/reference/appkit/nstableviewdelegate/1532417-tableview
答案 1 :(得分:6)
首先将tableview选择突出显示样式设置为
NSTableViewSelectionHighlightStyleNone
然后在你的tablView委托工具
tableView:shouldSelectRow:
并在其中编写此代码:
NSTableViewRow *row= [_mainTable rowViewAtRow:selectedRow makeIfNecessary:NO];
row.backgroundColor = [your color];
return YES;
答案 2 :(得分:0)
这是用于将自定义颜色设置为选定的行以及突出显示的文本颜色。输出应如下所示,
在上面的屏幕截图中,我们正在做
将背景所选颜色设置为白色
添加拐角半径
将文本颜色更改为蓝色
添加蓝色笔触颜色
您可以进行更多自定义,但是此答案涵盖了上述要点。
1。从子类化NSTableRowView开始
class CategoryTableRowView: NSTableRowView {
override func drawSelection(in dirtyRect: NSRect) {
if selectionHighlightStyle != .none {
let selectionRect = bounds.insetBy(dx: 2.5, dy: 2.5)
NSColor(calibratedRed: 61.0/255.0, green: 159.0/255.0, blue: 219.0/255.0, alpha: 1.0).setStroke()
NSColor(calibratedWhite: 1.0, alpha: 1.0).setFill()
let selectionPath = NSBezierPath(roundedRect: selectionRect, xRadius: 25, yRadius: 25)
selectionPath.fill()
selectionPath.stroke()
}
}
}
2。在NSTableViewDelegate方法中返回自定义的CategoryTableRowView()
func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
return CategoryTableRowView()
}
3。确保您的ViewController类中有selectionHighlightStyle
个常规对象
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.selectionHighlightStyle = .regular
}
4。要设置textColor,请创建NSTableCellView的子类
class CategoryCellView: NSTableCellView {
@IBOutlet weak var categoryTextField: NSTextField!
override var backgroundStyle: NSView.BackgroundStyle {
willSet{
if newValue == .dark {
categoryTextField.textColor = NSColor(calibratedRed: 61.0/255.0, green: 159.0/255.0, blue: 219.0/255.0, alpha: 1.0)
} else {
categoryTextField.textColor = NSColor.black
}
}
}
}
覆盖backgroundStyle
属性,并为文本设置所需的颜色。
注意:在我的情况下,我有一个自定义单元格,它带有一个categoryTextField
插座。因此,我使用以下文字设置颜色:
categoryTextField.textColor = NSColor.black
我希望这会有所帮助。谢谢。