NSTableRowView / NSTableCellView如何将自定义颜色设置为选定的行?

时间:2014-10-27 16:43:04

标签: objective-c macos cocoa

我正在尝试在选择表格行时实现自定义行颜色。

-(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编程没有经验。

有人可以建议任何解决方案吗?基本上我需要选择颜色是透明的。

3 个答案:

答案 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;

也阅读这些 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/NSTableViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/NSTableViewDelegate/tableView:rowViewForRow

用于选择风格 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/index.html#//apple_ref/occ/instp/NSTableView/selectionHighlightStyle

答案 2 :(得分:0)

这是用于将自定义颜色设置为选定的行以及突出显示的文本颜色。输出应如下所示,

enter image description here

在上面的屏幕截图中,我们正在做

  
      
  • 将背景所选颜色设置为白色

  •   
  • 添加拐角半径

  •   
  • 将文本颜色更改为蓝色

  •   
  • 添加蓝色笔触颜色

  •   

您可以进行更多自定义,但是此答案涵盖了上述要点。

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

5。在情节提要板中设置自定义课程 enter image description here

我希望这会有所帮助。谢谢。