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 из этого метода.

Другие вопросы по тегам