Set identifier of table cell view programmatically

929 views Asked by At

I have table view like this (in a mac cocoa application):

In the leftmost panel you can see that I have set the identifier of the Table Cell View to "1". That's fine if you just have 2 columns, once the number goes up, this approach will become cumbersome. Can I do this programmatically?

Here is an example:

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

}

I have assigned the cell identifiers by hand, and made them identical the corresponding column index, so as to creating a mapping between the cell id and the 2D array (which is the underlying data model) column index. The app is running fine, I just don't like assigning these IDs by click-and-point.

The full project can be found here: https://github.com/kindlychung/MysteriousNum

1

There are 1 answers

3
varun mehta On

Create custom cell and add init to it using following lines.

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

and register this cell class as.

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

also dequeueReusableCell using same cell like:

tableView.dequeueReusableCell(withIdentifier: "customCell",for: indexPath) as! CustomCell