更新后在 NSTableView 中的何处设置列宽

Where to Set Column Width in NSTableView After Updates

我设法编写了一个函数,通过最大字符串长度设置列宽。我需要这个来防止长字符串被剪断、缠绕等。 我现在的问题是,我要把函数放在哪里。换句话说,我什么时候知道 tableview 何时完成加载或更新?我找不到 NSTableView.

的任何可用通知

这是我的功能:

func columnWidthByMaxStringLength(forColumn: Int) -> CGFloat {

    let table = equationTableView!
    var width = 0
    for i in 0...table.numberOfRows-1 {
        let view = table.view(atColumn: forColumn, row: i, makeIfNecessary: true)
        let size = view?.fittingSize
        width = max(width, Int((size?.width)!))
    }

    return CGFloat(width)
}

我试图在 NSTableView 委托 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? 中调用此函数,但它不是正确的位置。它会引发错误。

在更新 table 视图之前,可以在加载 table 视图和数据时计算列的宽度。您可以重复使用单元格视图。

例如:

override func viewDidLoad() {
    super.viewDidLoad()
    self.data = …
    self.sizeToFit(column: tableView.column(withIdentifier: NSUserInterfaceItemIdentifier("name")))
    self.tableView.reloadData()
}

func sizeToFit(column: Int) {
    if let view = self.tableView.view(atColumn: column, row: 0, makeIfNecessary: true) as? NSTableCellView {
        let key = self.tableView.tableColumns[column].identifier.rawValue
        var width = self.tableView.tableColumns[column].minWidth
        for object in self.data {
            view.textField?.objectValue = object[key]
            let size = view.fittingSize
            width = max(width, size.width)
        }
        self.tableView.tableColumns[column].width = width
    }
}