10

我正在使用基于视图的表格视图,并且不希望它在选择时使用白色文本颜色绘制 NSTextFields。我无法找到可行的解决方案。因此,非常感谢任何帮助。

这是我的问题:

在此处输入图像描述

我希望“选择为白色”文本也以默认文本颜色绘制。

到目前为止,我发现

  • 设置属性tableView:viewForTableColumn:item:并没有真正帮助
  • NSTextField颜色设置为自定义颜色,这与控件默认颜色不同,将阻止以白色绘制,但仍会丢失字体样式(粗体、斜体等)。
  • 设置NSTableViewselectionHighlightStyle属性NSTableViewSelectionHighlightStyleNone做的伎俩,但它不会重绘NSTableRowView。选择风格也不是我想要的。我希望第一次单击以选择行,第二次单击以编辑文本字段。当您使用NSTableViewSelectionHighlightStyleNone您的第一次单击开始编辑文本字段。
  • 如果 NSTextField 有边框,文本颜色不会改变。但我不想要有边框的文本字段(如屏幕截图所示。文本字段是可编辑的)

我无法弄清楚文本字段“如何”获得白色。I have overridden setTextColor:and realized that it is never called when selection is changed. 所以我猜想 NSAttributedString 是在 NSTableView 绘图/选择例程内的某个地方构建的。

很感谢任何形式的帮助。

4

3 回答 3

14

我找到了答案。我不得不继承NSTableCellView和覆盖setBackgroundStyle:. 就这样!

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
  [super setBackgroundStyle: NSBackgroundStyleLight];
}
于 2012-07-24T23:56:21.877 回答
0

而不是覆盖NSTableCellView's backgroundStyle,我发现覆盖它更方便。这实际上是在选择期间默认更改单元格视图背景样式的方法。viewWillDraw()NSTableRowView

您可以通过以下方式禁用此行为:

class TableViewDelegate: NSObject, NSTableViewDelegate {
    func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
        return TableRowView(frame: NSRect.zero)
    }
}

class TableRowView : NSTableRowView {
    private override func viewWillDraw() {
        // By do nothing we prevent the super method to be called. It would otherwise change the selected cell view's backgroundStyle property.
    }
}
于 2016-03-30T09:32:44.210 回答
-1

我在表格视图委托的 -tableView:willDisplayCell:forTableColumn:row: 方法中设置单元格颜色。

-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell 
   forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
   if(tableView==<table view id of interest>)
      {
      ...
      [cell setTextColor:<colour appropriate for this cell>];
      ...
      }
   ...
}

这不会影响字体大小或样式。

于 2012-07-23T03:51:58.940 回答