如何反转所选NSTableView行的文本颜色

时间:2015-04-24 23:35:50

标签: xcode cocoa nstableview

我有一个NSTableView,我在其中更改特定列中文本的颜色,但是当选择一行时,文本不会更改为更合适的颜色,以便它可读。

Finder的Date Modified,Size和Kind列具有灰色文本,当您选择文件/文件夹行时,灰色文本将变为白色(以便在蓝色突出显示中可读)。

我无法在XCode上找到一个魔术复选框来默认启用此行为,所以是否有人知道我可能会达到相同的效果?

我在XCode 6.3中使用Swift。

感谢。

3 个答案:

答案 0 :(得分:17)

您不会说出您为自己的单元格使用的视图或视图层次结构。您也没有说明如何或在何处设置文本字段'颜色或颜色,具体而言。

选择行时,该行会自动计算其interiorBackgroundStyle。它还会设置单元格视图的backgroundStyle,如果它响应-setBackgroundStyle:,或者是NSControl,其中有一个响应该单元格的单元格。{/ p>

如果您的单元格视图是NSTableCellView的实例,则会将背景样式转发到符合相同条件的所有子视图。如果您使用不同的容器视图作为单元格视图,并且希望像这样转发背景样式,则必须在视图类中自己实现。

NSTextField的单元格(NSTextFieldCell)会响应-setBackgroundStyle:,因此上述机制会自动设置其背景样式。如果textColor是标准控件颜色之一(例如NSColor.controlTextColor()),文本字段单元格将自动将其文本颜色更改为白色,但如果您指定了非标准控件颜色,则不会这样做颜色。因此,如果您正在为文本设置特定颜色,则您有责任在背景样式更改时更改该颜色。

您可以使用NSTableCellView的子类并为didSet属性添加属性观察者(backgroundStyle)。这可以根据设置的样式更改文本字段textColor。例如,如果背景样式不是.Dark,则可以使用自定义颜色;如果是NSColor.controlTextColor(),则可以使用普通文本字段颜色.Dark(以便文本字段实际显示它白色)。

您还可以为文本字段使用NSTextFieldCell的子类,并执行相同的操作。或覆盖drawInteriorWithFrame(_:inView:)以根据背景样式使用不同的文字颜色进行绘制。

答案 1 :(得分:6)

在肯的回应(上图)的帮助下,我能够让它发挥作用。这是一份粗略的草稿,可以满足我的需求:

#tooltip
{
    display:none;
    height:50px;
    width:50px;    
    background-color:red;   
}

#tb1:focus #tooltip
{
   display:block;
}

如果我在身份检查器中将CustomTextFieldCell设置为我的表格视图单元格的自定义类,则它可以正常工作。我还需要为textColor添加一个属性观察器,以便当前突出显示的行获得相同的处理。我现在可以改变它,以便它不是硬编码的,但这证明了这个概念。

谢谢肯。

答案 2 :(得分:0)

如果您使用 NSColor.labelColor 等系统颜色,所选单元格的文本颜色将自动反转。如果您想为未选择的文本使用另一种颜色,您可以在自定义 NSTableCellView 类中使用如下代码:

override var backgroundStyle: NSView.BackgroundStyle {
    willSet {
        textField.textColor = newValue == .emphasized ? .labelColor : .secondaryLabelColor
    }
}

在此 Swift 示例中,所选文本颜色为 .labelColor,否则为 .secondaryLabelColor