The documentation for the NSTableViewDataSource protocol说
此方法是强制性的
如果您创建新的NSTableViewDataSource,编译器会要求您提供此方法以及numberOfRows(in tableView: NSTableView)
。
到目前为止,这么好。如果你提供它,它会立即为每一行调用一次......但是如果你删除它,那么表似乎每一点都有效。在这个方法的基于视图的表中似乎完全没有连接:在NSTableViewDelegate的tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int)
方法中,我根据数据源的内容数组返回新视图,如果我将一堆无意义的数据放入objectValueFor: row
(包括返回相同的字符串 - 我的表对象不是字符串)没有任何效果,因为我在viewFor tableColumn:
中设置了我的NSTableViewCells的值。
如果我正在通过直接从数据源中检索相应的值来处理选择更改(以及我想对对象做的任何事情)(例如)
func tableViewSelectionDidChange(_ notification: Notification) {
print(dataSource.allItems[tableView.selectedRow])
}
有没有理由实施这种方法?我无法看到实际使用该对象的任何一点,它感觉就像来自基于单元格的表格的人工制品。
我不想通过省略一个必要的方法来破坏我的代码,但是由于我将要使用自定义数据源尝试一些奇怪而精彩的东西,我也不希望使用一种方法使我的代码过度复杂化被调用,但其结果似乎完全没有意义。
答案 0 :(得分:2)
如果,单元格视图会响应setObjectValue:
,则表视图会调用该方法并传入从tableView(_:objectValueFor:row:)
获取的行的对象值。
NSTableCellView
会响应该方法,并且是一个常见的单元格视图类。 NSTextField
也有;它实际上是从NSControl
继承的。
在您的情况下,您的单元格视图要么没有objectValue
属性,要么更有可能是您没有使用它。
一种常见配置是使用NSTableCellView
作为单元格视图,然后使用绑定将子视图绑定到通过其objectValue
属性的关键路径。