NSTableView не будет вызывать viewForTableColumn
Я пытаюсь создать табличное представление без конструктора интерфейса с нуля в моем приложении Какао и мой viewForTableColumn
метод отказывается вызывать.
Моя таблица создается с использованием этого кода.
let tableView: NSTableView = {
let table = NSTableView(frame: .zero)
table.headerView = nil
table.addTableColumn(NSTableColumn(identifier: .column))
return table
}()
У меня также есть это расширение для NSUserInterfaceItemIdentifier
учебный класс
extension NSUserInterfaceItemIdentifier {
static let cell = NSUserInterfaceItemIdentifier("cell")
static let column = NSUserInterfaceItemIdentifier("column")
}
Контроллер моего представления реализует NSTableViewDataSource
а также NSTableViewDelegate
и они установлены в viewDidLoad
метод. Табличное представление также в представлении прокрутки.
let scrollView = NSScrollView()
override func viewDidLoad() {
self.scrollView.documentView = self.tableView
self.scrollView.hasVerticalScroller = true
self.view.addSubview(self.scrollView)
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.reloadData() // To make sure the method would be called.
}
Значение, возвращаемое из numberOfRows
метод больше чем 0
и выполняется.
Насколько я понимаю, следующий метод должен вызываться с параметром строки в диапазоне от 0 до значения, возвращаемого numberOfRows
но это никогда не вызывается.
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard let view = self.tableView.makeView(withIdentifier: .cell, owner: self) as? NSTableCellView else {
return nil
}
// set the text/font for the view
return view
}
Я также пытался использовать dataCellFor
а также rowViewForRow
но никому из них не звонят.
РЕДАКТИРОВАТЬ:
Я проверил каркас своих элементов, чтобы убедиться, что вид таблицы и строки были видны.
1 ответ
Согласно одному из комментариев под вашим вопросом tableView(_:viewFor:row:)
вызывается, он просто возвращается nil
, Это имеет смысл, учитывая вашу реализацию этого метода. когда makeViewWithIdentifier
не удается вручную создать соответствующий вид и вернуть его, а не возвращать nil
, Таким образом, ваша реализация должна выглядеть примерно так:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
if let recycledView = self.tableView.makeView(withIdentifier: .cell, owner: self) as? NSTableCellView {
return recycledView
} else {
// create view from scratch
let newCell = NSTableCellView()
newCell.identifier = NSUserInterfaceItemIdentifier.cell
// customise here...
return newCell
}
}
Посмотрите еще раз на ссылку, которую я указал в своем комментарии, вы увидите, что эта реализация никогда не вернется nil
из этого метода.