如何使用动态创建列

时间:2017-03-02 11:00:40

标签: macos swift3 nstableview nstablecellview

我正在尝试使用Swift 3为macOS创建桌面应用程序。

我的窗口有两个基于视图的表,其中一个表显示了有效负载大小的数据包列表。选择数据包时,第二个表显示有效负载字节。由于有效负载大小不同,第二个表具有以编程方式创建的列;选择的最大数据包大小决定了最大列数。

如果我使用基于单元格的表格,我没有任何问题,但我更喜欢使用基于视图的表格。

创建列

for i in numCols ..< maxCols {

  let col = NSTableColumn()
  col.identifier = "Byte\(i)ColumnID"
  col.headerCell.stringValue = "[\(i)]"
  tableViewPayload.addTableColumn(col)

}

问题出现在viewFor委托方法中,其中

tableView.make(withIdentifier: (tableColumn?.identifier)!, owner: self) as? NSTableCellView

返回nil

如果我直接返回NSTextField或创建NSTableCellView NSTextField作为子视图,则此方法有效:

let frameRect = NSRect(x: 0, y: 0, width: (tableColumn?.width)!, height: 20)      
let cell = NSTableCellView(frame: frameRect)
cell.identifier = (tableColumn?.identifier)!      

let textField = NSTextField(frame: cell.frame)
textField.stringValue = "Test"
cell.addSubview(textField)

return cell

这种方法需要更多的单元格样式,我应该将NSTableCellView作为子类。

我的问题是为什么make(withIdentifier:owner:)方法不适用于动态创建的列?我创建列时是否遗漏了某些内容?

我有没有办法创建NSTableCellView并使用textField属性?

1 个答案:

答案 0 :(得分:0)

我以编程方式构建完整的NSTableViews。假设您询问NSTableView.makeView方法。我使用swift 4。

您知道为表创建的任何列都绑定到它,反之亦然?

对于为表创建的每个列,我调用

column.tableView = tableview
tableview.addTableColumn(column)