【发布时间】:2020-11-25 01:03:18
【问题描述】:
我在一个NSTableCellView 中有三个NSViews。根据该行的数据,我想在NSView 上显示一个带有边框的选定角色,如下所示:
蓝色边框NSView 是一个子类,如下所示:
class RolePill: NSView{
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
layer?.cornerRadius = 9
layer?.borderWidth = 2
layer?.borderColor = NSColor.clear.cgColor
}
}
当我的表格像这样加载时,角色最初被设置:
extension UsersVC: NSTableViewDelegate, NSTableViewDataSource{
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "UserCell"), owner: nil) as! UserCell
let user = users[row]
//Role
cell.setRole(role: user.role)
}
}
我的表格单元格在加载和单击按钮时设置角色,设置如下:
class UserCell: NSTableCellView{
@IBOutlet weak var wrapOwner: RolePill!
@IBOutlet weak var wrapAdmin: RolePill!
@IBOutlet weak var wrapUser: RolePill!
@IBAction func clickOwner(_ sender: NSButton) {
setRole(role: "owner")
}
@IBAction func clickAdmin(_ sender: NSButton) {
setRole(role: "admin")
}
@IBAction func clickUser(_ sender: NSButton) {
setRole(role: "user")
}
func setRole(role: String){
let selectedColor = getAccentColor()
let offColor = Color(named: "BravoDark")!
let offTextColor = Color(named: "BFC0C2")
switch role{
case "owner":
wrapOwner.layer?.borderColor = selectedColor.cgColor
wrapAdmin.layer?.borderColor = offColor.cgColor
wrapUser.layer?.borderColor = offColor.cgColor
labelOwner.textColor = Color.white
labelAdmin.textColor = offTextColor
labelUser.textColor = offTextColor
case "admin":
wrapOwner.layer?.borderColor = offColor.cgColor
wrapAdmin.layer?.borderColor = selectedColor.cgColor
wrapUser.layer?.borderColor = offColor.cgColor
labelOwner.textColor = offTextColor
labelAdmin.textColor = Color.white
labelUser.textColor = offTextColor
default:
wrapOwner.layer?.borderColor = offColor.cgColor
wrapAdmin.layer?.borderColor = offColor.cgColor
wrapUser.layer?.borderColor = selectedColor.cgColor
labelOwner.textColor = offTextColor
labelAdmin.textColor = offTextColor
labelUser.textColor = Color.white
}
}
}
当表格最初加载时,无论何时刷新 (tableView.reloadData()),我都会失去边框,看起来像这样:
如您所见,textColor 正确设置为白色。但由于某种原因,直到我实际单击 IBAction 按钮之一并手动触发更改时,才会设置边框。
我怀疑这是某种图层绘制错误,每次我的NSTableView 重新加载时,RolePill 类都会重新绘制,但我不知道如何让它接受在tableView viewForRow 中发送的初始角色状态.
知道我在这里做错了什么吗?谢谢!
【问题讨论】:
-
user.role的值是多少? -
user.role是一个String,它可以是owner、admin或user。 -
role改变时是否重绘单元格?