0

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

1 に答える 1