NSTableView不会调用viewForTableColumn

时间:2018-12-05 06:17:12

标签: swift cocoa swift4 nstableview nstableviewcell

我试图在Cocoa应用中从头开始构建没有界面构建器的表视图,并且我的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")
}

我的视图控制器正在实现NSTableViewDataSourceNSTableViewDelegate,它们是在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
}

我也尝试使用dataCellForrowViewForRow,但没有一个被调用。

编辑:

我检查了元素的框架,以确保表视图和行可见。

view hierarchy

1 个答案:

答案 0 :(得分:0)

根据问题tableView(_:viewFor:row:) 下方的评论之一,它只是返回nil。考虑到您对该方法的实现,这很有意义。当makeViewWithIdentifier失败时,您需要手动创建相关视图并返回 it ,而不是返回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