我试图在我的 Cocoa 应用程序中从头开始构建一个没有界面生成器的表格 View ,但我的 viewForTableColumn
方法拒绝被调用。
我的表格 View 是使用此代码创建的。
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")
}
我的 View Controller 正在实现 NSTableViewDataSource
和 NSTableViewDelegate
,它们是在 viewDidLoad
方法中设置的。表格 View 也变成了 ScrollView 。
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
但它们都没有被调用。
编辑:
我已经检查了元素的框架,以确保 TableView 和行可见。
最佳答案
根据您的问题 tableView(_:viewFor:row:)
is 被调用的评论之一,它只是返回 nil
。考虑到您对该方法的实现,这是有道理的。当 makeViewWithIdentifier 失败时,您需要手动创建相关 View 并返回它,而不是返回 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
。
关于swift - NSTableView 不会调用 viewForTableColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53626254/