更新后在NSTableView中设置列宽的位置

时间:2018-03-22 22:13:18

标签: notifications nstableview column-width

我设法编写了一个函数,用最大字符串长度设置列宽。我需要这个来防止长弦剪裁,包裹等。 我现在的问题是,我在哪里放置这个功能。换句话说,我何时知道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?内调用此功能,但它不是正确的地方。它会引发错误。

1 个答案:

答案 0 :(得分:1)

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

例如:

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