一些 TableView 视图没有重新加载,因为我的 TableView Delegate 没有收到 tableView:viewFor:row: for every row

Some TableView views are not reloading, as my TableView Delegate is not receiving tableView:viewFor:row: for every row

我有一个TableView,还有一个TableViewController

TableView'sdelegatedatasource设置为TableViewController

因此,当 table 开始绘制时,它会向代理请求视图,此代码运行:

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 列的每个视图?运行时如何决定哪些视图获得更新调用?

啊,解决了,我修改了原来的代码,因为我认为它与显示无关:

    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
            }
        }

现在完美运行