cocoa - 如何在 Cocoa NSTableView 中添加列?

标签 cocoa nstablecolumn

我想在 NSTableView 中显示数据。列数未指定(可以是 1 到 ?? 之间的任意值,具体取决于数据),因此我无法使用 Interface Builder。
因此,我将表(使用 IB)初始化为 1 列,然后根据需要添加新列(然后删除不再需要的第 0 列)。我为每个添加的列提供一个唯一的标识符。到目前为止一切顺利。
我实现了tableView(-:viewForTableColumn:row)函数,如下所示,但是makeViewWithIdentifier返回nil。怎么了?
如果我检测到nil返回,我会使用正确的标识符创建一个NSTableCellView实例。但数据没有显示在表中。可能出了什么问题?

代码如下(删除了不必要的行):

import Cocoa
class MyViewController: NSViewController {

@IBOutlet weak var dataTable: NSTableView!
}
var donnees: DataFrame = DataFrame()    // Some table-like data with unspecified number of columns

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    initData()      // get the actual data

    //      Make the ad-hoc number of columns
    if donnees.nbCol > 0 {
        for k in 0..<donnees.nbCol {
            let newColumn = NSTableColumn(identifier: idArray[k])       // idArray : [String] of unique identifiers
            dataTable.addTableColumn(newColumn)
        }
    }
    dataTable.removeTableColumn(dataTable.tableColumns[0])  // remove the original column, now unnecessary
}  
}  
extension MyViewController : NSTableViewDataSource {
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    return self.donnees.nbRow
}  
}  
extension MyViewController : NSTableViewDelegate {
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let columnID = tableColumn!.identifier
    var cellView: NSTableCellView
    let cellViewTmp = tableView.makeViewWithIdentifier(columnID, owner: self)
    if cellViewTmp == nil {     // then create a new NSTableCellView instance
        cellView = NSTableCellView(frame: NSRect(x: 0, y: 0, width:  (tableColumn?.width)!, height: 20))
        cellView.identifier = columnID
        print("CellView créé pour id \(columnID) au rang \(row)")
    } else {
        cellView = cellViewTmp as! NSTableCellView
    }
    cellView.textField?.stringValue = "AAA"
    return cellView
}  
}

最佳答案

宾果游戏!感谢 Willeke,我重写了代码,如下所示:

var donnees: DataFrame = DataFrame()    // Some table-like data with unspecified number of columns

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    initData()      // get the actual data
    self.setTableColumns() // and prepare the columns accordingly
}
    func setTableColumns() {
    // In Interface Builder I've prepared a cell view in the 0-th tableColumn and set the identifier of this NSTableColumn to "ModelCellView"
        let myCellViewNib = dataTable.registeredNibsByIdentifier!["ModelCellView"]   // I save the cellView's Nib
    //      Make the ad-hoc number of columns
        if donnees.nbCol > 0 {
            for k in 0..<donnees.nbCol {
                let newColumn = NSTableColumn(identifier: idArray[k])       // idArray : [String] of unique identifiers
                dataTable.addTableColumn(newColumn)
                dataTable.registerNib(myCellViewNib, forIdentifier: newColumn.identifier)  // I register the above Nib for the newly added tableColumn
            }
            dataTable.removeTableColumn(dataTable.tableColumns[0])  // remove the original column, now unnecessary
        }
    }

extension MyViewController : NSTableViewDataSource {
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    return self.donnees.nbRow
}  
extension MyViewController : NSTableViewDelegate {
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let columnID = tableColumn!.identifier
    let cellView = tableView.makeViewWithIdentifier(columnID, owner: self) as! NSTableCellView
    cellView.textField?.stringValue = "theActualCellData"
    return cellView
}  

它按照预期完美运行。再次感谢 Willeke。

关于cocoa - 如何在 Cocoa NSTableView 中添加列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56559279/

相关文章:

objective-c - 如何以编程方式将 NSTableColumn 绑定(bind)到 NSArrayControllerarrangedObjects?

cocoa - NSTableColumn 仅自动调整第一列的大小

cocoa - 如何在表格标题中显示排序指示器?

cocoa - NSNetService 说它已发布,但在网络上不可见

cocoa - 来自 NSEvent/CGEvent 的设备信息

cocoa - 如何在具有多个排序描述符的列上设置指示图像?

macos - 如何使 NSTableView 列在调整大小时适合其内容?

objective-c - 查找 Objective C 的 TextView 中特定文本的实例数

objective-c - 如何在 Cocoa 中自定义 NSTextField 外观(使用的字体、字体大小)?

cocoa - 保留对 NSThread 的引用并向其对象发送消息?