一些TableView视图没有重新加载,因为我的TableView Delegate没有接收tableView:viewFor:row:每行

时间:2017-09-21 09:22:30

标签: swift macos cocoa nstableview

我有TableViewTableViewController

TableView's delegatedatasource设置为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
        }
     }

正确更新按钮:
enter image description here

请注意技术风险有5个标志

但是,当我按照供应风险排序时,会调用tableView.reloadData()

但是,并非所有视图都会重新加载?

因此,有些旗帜保持黑色,即使它们不应该是(现在注意到技术风险中有8个以上的黑旗)

enter image description here

看似随机的哪些标志是黑色的(当我通过上下文菜单通过另一个视图查看数据时,我可以判断哪些标志应该是真正的黑色)

表面上看,它看起来像是一个重绘问题。我已尝试过所有内容,但无法重绘这些观看次数。我错过了什么吗?

我已经确认tableView:viewFor:row:没有像我认为的那样多次被调用

我想,总而言之,我认为调用reloadData()会更新每一行x列的每个视图?运行时如何决定哪些视图获得更新调用?

1 个答案:

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

现在它完美无缺