如何在子视图中保留控件文本颜色的功能?
问题描述:
我有一个NSTableview标签内外的子视图。 选择一行时,文本标签中文本的颜色应变为白色。如何在子视图中保留控件文本颜色的功能?
在这种情况下,Status
和Rank
都有控件文本颜色,但只有当Status
选择,因为它不是在一个子视图变为白色。
是否可以保持颜色控制这个功能在为textLabel即使是在一个子视图?
答
您必须手动代码,通过添加扩展或声明子类,并覆盖setBackgroundStyle
,因为NSTableView
不会递归调用函数到其子视图。
extension NSTableView {
func setBackgroundStyle(_ newValue: NSBackgroundStyle) {
for view in self.subviews {
view.setBackgroundStyle(newValue)
}
}
}
extension NSTextField {
func setBackgroundStyle(_ newValue: NSBackgroundStyle) {
switch newValue {
case NSBackgroundStyleDark:
self.textColor = NSColor.controlHighlightColor
case NSBackgroundStyleLight:
self.textColor = NSColor.controlColor
}
super.setBackgroundStyle(newValue)
}
}
这看起来像一个绝对合理的方法。我尝试了一些,但也有一些问题:子视图中的视图是NSView而不是NSTextfield。所以它不能识别'setBackgreoundStyle()'。同样在NSTextfield扩展中,'override func setBackgroundStyle'“不会覆盖任何metod从它的超类”。 –
对不起,您只需实现setBackgroundStyle函数,不需要重写,检查NSTableCellView类参考: 设置后,默认实现会自动将调用转发给实现-setBackgroundStyle的所有子视图:或者是NSControl(其中包含NSCells,它们响应-setBackgroundStyle:)._ –