为什么NSTableCellView.backgroundStyle永远不会为所选行设置为NSBackgroundStyle.Dark?

时间:2015-01-28 08:44:16

标签: macos cocoa swift nstableview nstablecellview

在基于视图的NSTableView中,我有一个NSTableCellView的子类。

我想更改所选行的cellView的文本颜色。

class CellView: NSTableCellView {

    override var backgroundStyle: NSBackgroundStyle {
        set {
            super.backgroundStyle = newValue

            self.udpateSelectionHighlight()
        }
        get {
            return super.backgroundStyle;
        }
    }

    func udpateSelectionHighlight() {
        if ( self.backgroundStyle == NSBackgroundStyle.Dark ) {
            self.textField?.textColor = NSColor.whiteColor()
        } else if( self.backgroundStyle == NSBackgroundStyle.Light ) {
            self.textField?.textColor = NSColor.blackColor()
        }
    }

}

问题是所有的cellViews都是用NSBackgroundStyle.Light设置的。

我的选择是在NSTableRowView的子类中自定义绘制的。

class RowView: NSTableRowView {

    override func drawSelectionInRect(dirtyRect: NSRect) {
        if ( self.selectionHighlightStyle != NSTableViewSelectionHighlightStyle.None ) {

            var selectionRect = NSInsetRect(self.bounds, 0, 2.5)
            NSColor( fromHexString: "d1d1d1" ).setFill()
            var selectionPath = NSBezierPath(
                roundedRect: selectionRect,
                xRadius: 10,
                yRadius: 60
            )
            // ...
            selectionPath.fill()
        }
    }

    // ...

}

为什么选中的行cellView的backgroundStyle属性不是设置为Dark?

感谢。

1 个答案:

答案 0 :(得分:5)

虽然我仍然不知道为什么对于TableView / RowView在所选行的cellView上设置深色背景,我发现这是一个可接受的解决方法:

class CellView: NSTableCellView {

    override var backgroundStyle: NSBackgroundStyle {
        set {
            if let rowView = self.superview as? NSTableRowView {
                super.backgroundStyle = rowView.selected ? NSBackgroundStyle.Dark : NSBackgroundStyle.Light
            } else {
                super.backgroundStyle = newValue
            }
            self.udpateSelectionHighlight()
        }
        get {
            return super.backgroundStyle;
        }
    }

    func udpateSelectionHighlight() {
        if ( self.backgroundStyle == NSBackgroundStyle.Dark ) {
            self.textField?.textColor = NSColor.whiteColor()
        } else {
            self.textField?.textColor = NSColor.blackColor()
        }
    }

}