如何更改使用 NSArrayContoller 作为内容源的 NSTableView 的选择颜色?
How to change selection color for NSTableView which use NSArrayContoller as content source?
我有一个 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 对象。
谢谢。
我就是这样做的。如您所说,第一个 subclass 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:
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
}
}
首选方法是重写 drawSelection(in:),draw(_:)
的默认实现在需要为所选行绘制选区时调用该方法。您不必自己检查选择状态。
override func drawSelection(in dirtyRect: NSRect) {
NSColor.green.setFill()
dirtyRect.fill()
}
但是,如果您也覆盖 draw(in:)
并且不调用超类实现,则您将不得不手动调用 drawSelection(in:)
并自行确定选择状态。覆盖 drawSelection(in:)
的另一个好处是 "the selection will automatically be alpha-blended if the selection is animating in or out.".
Swift@Prontto 的出色回答的第 4 版。
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()
}
我有一个 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 对象。
谢谢。
我就是这样做的。如您所说,第一个 subclass 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:
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
}
}
首选方法是重写 drawSelection(in:),draw(_:)
的默认实现在需要为所选行绘制选区时调用该方法。您不必自己检查选择状态。
override func drawSelection(in dirtyRect: NSRect) {
NSColor.green.setFill()
dirtyRect.fill()
}
但是,如果您也覆盖 draw(in:)
并且不调用超类实现,则您将不得不手动调用 drawSelection(in:)
并自行确定选择状态。覆盖 drawSelection(in:)
的另一个好处是 "the selection will automatically be alpha-blended if the selection is animating in or out.".
Swift@Prontto 的出色回答的第 4 版。
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()
}