我试图在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")
}
我的视图控制器正在实现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
,但没有一个被调用。
编辑:
我检查了元素的框架,以确保表视图和行可见。
答案 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
。