tableView的目的(_:objectValueFor:row :)

时间:2017-01-17 22:49:40

标签: swift nstableview

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])
}

有没有理由实施这种方法?我无法看到实际使用该对象的任何一点,它感觉就像来自基于单元格的表格的人工制品。

我不想通过省略一个必要的方法来破坏我的代码,但是由于我将要使用自定义数据源尝试一些奇怪而精彩的东西,我也不希望使用一种方法使我的代码过度复杂化被调用,但其结果似乎完全没有意义。

1 个答案:

答案 0 :(得分:2)

如果,单元格视图会响应setObjectValue:,则表视图会调用该方法并传入从tableView(_:objectValueFor:row:)获取的行的对象值。

NSTableCellView会响应该方法,并且是一个常见的单元格视图类。 NSTextField也有;它实际上是从NSControl继承的。

在您的情况下,您的单元格视图要么没有objectValue属性,要么更有可能是您没有使用它。

一种常见配置是使用NSTableCellView作为单元格视图,然后使用绑定将子视图绑定到通过其objectValue属性的关键路径。