更新后在 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
}
}
我设法编写了一个函数,通过最大字符串长度设置列宽。我需要这个来防止长字符串被剪断、缠绕等。
我现在的问题是,我要把函数放在哪里。换句话说,我什么时候知道 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
}
}