以编程方式设置表格单元格视图的标识符

时间:2016-12-14 11:31:29

标签: cocoa swift3 nstableview macos-sierra

我有这样的表格视图(在mac cocoa应用程序中):

在最左边的面板中,您可以看到我已将Table Cell View的标识符设置为" 1"。如果您只有2列,这很好,一旦数量增加,这种方法将变得很麻烦。我可以通过编程方式执行此操作吗?

以下是一个例子:

import Cocoa

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

private var dataModel = DataModel()
private var answer = 0
private var keyData: (Int, [Int]) = (0, []) {
    didSet {
        tbl.reloadData()
    }
}

@IBOutlet weak var questionIndex: NSTextField!
@IBOutlet weak var tbl: NSTableView!
@IBAction func replay(_ sender: Any) {
    dataModel = DataModel()
    questionIndex.stringValue = "0:"
    answer = 0
    updateModel()
}

@IBAction func forward(_ sender: NSButton) {
    if sender.tag == 1 {
        answer += keyData.0
    }
    updateModel()
}

func updateModel() {
    let group = dataModel.nextGroup()
    if let g = group {
        self.keyData = g
        let s = questionIndex.stringValue
        questionIndex.stringValue = String(Int(String(s.characters.dropLast()))! + 1) + ":"
        return
    }
    let alert = NSAlert()
    alert.messageText = "You did have \(answer) on your mind, didn't you?"
    alert.runModal()
}

override func viewDidLoad() {
    super.viewDidLoad()
    for (n, col) in tbl.tableColumns.enumerated() {
        col.identifier = String(n)
    }
    updateModel()
}

func numberOfRows(in tableView: NSTableView) -> Int {
    return keyData.1.count / 8 + 1
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let colId = tableColumn!.identifier
    let colIndex = Int(colId)!
    let index = (row * 8) + colIndex
    let cell = tbl.make(withIdentifier: colId, owner: self) as! NSTableCellView
    if 0 <= index && index < keyData.1.count {
        cell.textField!.integerValue = keyData.1[index]
    } else {
        cell.textField!.stringValue = ""
    }
    return cell
}

override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
}

}

我手动分配了单元格标识符,并使它们与相应的列索引相同,以便在单元格id和2D数组(它是底层数据模型)列索引之间创建映射。该应用程序运行正常,我只是不喜欢通过点击点分配这些ID。

可在此处找到完整项目:https://github.com/kindlychung/MysteriousNum

1 个答案:

答案 0 :(得分:-1)

创建自定义单元格并使用以下行向其添加init。

git log --graph

并将此单元格类注册为。

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
}

也使用相同的单元格dequeueReusableCell:

self.tableView.register(CustomCell.self, forCellReuseIdentifier: "customCell")