我有TableView
和TableViewController
TableView's
delegate
和datasource
设置为TableViewController
因此,当表格进行绘制时,它会向代表询问视图,并运行此代码:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.make(withIdentifier: "flagView", owner: self) as? TableCellView
case "technicalFlag", "supplyFlag":
let button = result?.control as? NSButton {
button.state = value.boolValue ? NSOnState : NSOffState
}
}
请注意技术风险有5个标志
但是,当我按照供应风险排序时,会调用tableView.reloadData()
但是,并非所有视图都会重新加载?
因此,有些旗帜保持黑色,即使它们不应该是(现在注意到技术风险中有8个以上的黑旗)
看似随机的哪些标志是黑色的(当我通过上下文菜单通过另一个视图查看数据时,我可以判断哪些标志应该是真正的黑色)
表面上看,它看起来像是一个重绘问题。我已尝试过所有内容,但无法重绘这些观看次数。我错过了什么吗?
我已经确认tableView:viewFor:row:
没有像我认为的那样多次被调用
我想,总而言之,我认为调用reloadData()
会更新每一行x列的每个视图?运行时如何决定哪些视图获得更新调用?
答案 0 :(得分:0)
啊解决了,我修改了原始代码,因为我认为它与展示无关:
case "technicalRiskFlag", "supplyRisk":
if let value = node.value(forKeyPath: identifier) as? NSNumber,
let button = result?.control as? NSButton {
button.state = value.boolValue ? NSOnState : NSOffState
}
但事实证明value
可能是nil
,最终没有重绘国旗。不知道为什么代理方法没有被调用,但我将代码更改为:
if let button = result?.control as? NSButton {
if let value = node.value(forKeyPath: identifier) as? NSNumber {
button.state = value.boolValue ? NSOnState : NSOffState
} else {
button.state = NSOffState
}
}
现在它完美无缺