我有一个NSTableView,我在其中更改特定列中文本的颜色,但是当选择一行时,文本不会更改为更合适的颜色,以便它可读。
Finder的Date Modified,Size和Kind列具有灰色文本,当您选择文件/文件夹行时,灰色文本将变为白色(以便在蓝色突出显示中可读)。
我无法在XCode上找到一个魔术复选框来默认启用此行为,所以是否有人知道我可能会达到相同的效果?
我在XCode 6.3中使用Swift。
感谢。
答案 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
。