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