【问题标题】:NSTableView won't call viewForTableColumnNSTableView 不会调用 viewForTableColumn
【发布时间】:2018-12-05 06:17:11
【问题描述】:

我正在尝试在我的 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,但它们都没有被调用。

编辑:

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

【问题讨论】:

  • 一个不可见的表格视图不请求视图。 scrollView的框架是什么?
  • 框架设置为窗口大小,设置背景色为红色确认可见。
  • table view的frame和column的宽度也ok吗?如果捕获视图层次结构,表格视图是否可见?
  • 我添加了视图层次结构的图片,蓝色视图是scrollView,红色是tableView
  • 我尝试了您的代码(添加了self.scrollView.frame = self.view.boundsnumberOfRowsInTableView)并调用了viewForTableColumn。它返回nil

标签: swift cocoa swift4 nstableview nstableviewcell


【解决方案1】:

根据您的问题tableView(_:viewFor:row:) is 下方的 cmets 之一,它只是返回 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

【讨论】:

  • 我尝试在其中放置一个打印和一个断点,但没有一个被触发。我现在已经解决了我的问题,仍然不确定哪里出了问题,我重写了整个NSWindow,唯一的区别是我取出了NSViewController。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多