Ответ 1
Ваша реализация -tableView(_:viewForTableColumn:row:)
должна выглядеть примерно так:
func tableView(tableView: NSTableView,
viewForTableColumn
tableColumn: NSTableColumn?,
row: Int) -> NSView? {
var retval: NSView?
if let spareView = tableView.makeViewWithIdentifier("CodeCreatedTableCellView",
owner: self) as? NSTableCellView {
// We can use an old cell - no need to do anything.
retval = spareView
} else {
// Create a text field for the cell
let textField = NSTextField()
textField.backgroundColor = NSColor.clearColor()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.bordered = false
textField.controlSize = NSControlSize.SmallControlSize
// Create a cell
let newCell = NSTableCellView()
newCell.identifier = "CodeCreatedTableCellView"
newCell.addSubview(textField)
newCell.textField = textField
// Constrain the text field within the cell
newCell.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("H:|[textField]|",
options: [],
metrics: nil,
views: ["textField" : textField]))
newCell.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat("V:|[textField]|",
options: [],
metrics: nil,
views: ["textField" : textField]))
textField.bind(NSValueBinding,
toObject: newCell,
withKeyPath: "objectValue",
options: nil)
retval = newCell
}
return retval
}
В случае, если ваша таблица содержит сотни строк, Cocoa будет пытаться повторно использовать созданные ранее представления, но больше не находится на экране. Первая часть этого фрагмента использует метод NSTableView
для поиска такого представления. Если ни один не найден, вам нужно создать его с нуля.
Если у вас нет причин для этого, вы должны использовать экземпляр (или подкласс) NSTableCellView
в качестве вашего представления. Он не добавляет особого значения в NSView
, но одна из его ключевых особенностей заключается в том, что он сохраняет ссылку на модель, представленную представлением (устанавливается -tableView(_:objectValueForTableColumnRow:row:)
). В этом примере я использовал эту функцию для установки строкового значения текстового поля с помощью привязок.
Следует отметить, что вы должны дать вашему представлению идентификатор, который соответствует идентификатору, который вы указали для NSTableColumn
, в котором будет отображаться представление. Это позволяет вашему представлению таблицы использовать функцию повторного просмотра, описанную выше.