2016-12-14 5 views
0

У меня есть вид таблицы, как это (в приложении какао макинтош):Установить идентификатор вида таблицы ячейки программного

В крайней левой панели вы можете увидеть, что я поставил идентификатор 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 (который является базовой моделью данных). Приложение работает нормально, мне просто не нравится назначать эти идентификаторы по кликам.

Полный проект можно найти здесь: https://github.com/kindlychung/MysteriousNum

+0

Идентификаторы обычно не используется для указания индекса, а «типа» ячейки, которые могут появиться в вашей таблице. Как «GroupCell» или «ItemCell». –

+0

Да, хотя он также может быть представлен числом. Например, типы Enum могут быть Int. Идентификатор 1 здесь, вероятно, является строкой «1». – qed

+0

Но это не главное. Дело в том, что ** как я могу установить этот идентификатор программно **, на «GroupCell», если хотите. – qed

ответ

3

Создание пользовательских ячейки и добавить инициализации к нему, используя следующие строки.

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

и зарегистрируйте этот класс ячейки как.

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

также dequeueReusableCell используя ту же клетку, как:

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

Вопрос явно о macOS (*** NS ** TableView *) – vadian

Смежные вопросы