如何更改使用NSArrayContoller作为内容源的NSTableView的选择颜色?

时间:2015-04-06 15:16:48

标签: swift nstableview osx-yosemite

我有一个NSTableView(基于视图),他从NSarrayController中显示信息。所有连接均由IB制成。 一切都很好,但蓝色选择颜色看起来不适合我的设计理念,所以我想用我自己的颜色改变这种颜色,但直到现在我都失败了。

class MyTable: NSTableView, NSTableViewDelegate {
    override func drawBackgroundInClipRect(clipRect: NSRect) {

        if self.isRowSelected( self.selectedRow ){
            //NSColor.brownColor().colorWithAlphaComponent(0.9).setFill()
           // NSBezierPath.fillRect(clipRect)
            println("selected")

        }
    }


}

我真正的问题是:我不知道我应该从哪里开始,子类,NSTableView,NSTableCellView等。

最近我发现了一个方法,它说我应该继承NSTableRowView,并覆盖drawSelectionInRect函数。 我已经做到了,但在IB中我没有NSTableRowView对象。

感谢。

3 个答案:

答案 0 :(得分:17)

我这样做了。第一个子类NSTableRowView如你所说:

class MyRowView: NSTableRowView {

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        if selected == true {
            NSColor.greenColor().set()
            NSRectFill(dirtyRect)
        }
    }
}

然后只需添加此方法:

func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    let myCustomView = MyRowView()
    return myCustomView
}

如果我没记错的话,应该这样做。

编辑:我只是试试我的例子而且有效。在IB中,我将tableview的委托和数据源设置为ViewController,并将我唯一的列命名为" name。"这是我的整个ViewController类:

class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

    var persons = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        populate()
    }

    func populate() {
        var first = Person(name: "John")
        var second = Person(name: "Jesse Pinkman")

        persons = [first, second]
    }

    func numberOfRowsInTableView(tableView: NSTableView) -> Int {
        return persons.count
    }

    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
        if tableColumn?.identifier == "name" {
            let view = tableView.makeViewWithIdentifier(tableColumn!.identifier!, owner: self) as! NSTableCellView
            view.textField?.stringValue = persons[row].name
            return view
        }
        return nil
    }

    func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
        let myCustomView = MyRowView()
        return myCustomView
    }

}

答案 1 :(得分:5)

首选方法是覆盖drawSelection(in:)draw(_:)默认实现override func drawSelection(in dirtyRect: NSRect) { NSColor.green.setFill() dirtyRect.fill() } ,当需要绘制所选行的选择时。您不必自己检查选择状态。

draw(in:)

但是,如果您也覆盖drawSelection(in:)并且不调用超类实现,则必须手动调用drawSelection(in:)并自行确定选择状态。覆盖LOGIN_REDIRECT_URL = '/icontrol/iform/list' 的另一个好处是“如果选择是动画输入或输出,则选择将自动进行alpha混合。”

答案 2 :(得分:3)

Swift 4版@Prontto的优秀答案。

class MyRowView: NSTableRowView {
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        if isSelected == true {
            NSColor.green.set()
            dirtyRect.fill()
        }
    }
}

// In your NSTableViewDelegate
func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
    return MyRowView()
}