![](/img/trans.png)
[英]How to learn in Swift inside 'tableViewSelectionDidChange:' in which NSTableView the selection did change?
[英]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对象。
谢谢。
我是这样做的。 如您所说,第一个子类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中,我将表视图的委托和数据源设置为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
}
}
首选方法是重写drawSelection(in :) ,当需要绘制所选行的选择内容时, draw(_:)
的默认实现会调用该方法。 您不必自己检查选择状态。
override func drawSelection(in dirtyRect: NSRect) {
NSColor.green.setFill()
dirtyRect.fill()
}
但是,如果您也重写了draw(in:)
并且不调用超类实现,则必须手动调用drawSelection(in:)
并drawSelection(in:)
确定选择状态。 覆盖drawSelection(in:)
另一个好处是“如果选择动画或不动画,则选择将自动进行alpha混合”。
@Prontto的Swift 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()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.