我想在不使用Cocoa绑定的情况下实现大纲视图。

我检查了this tutorial之中的一些,但它们都不使用数据源方法

optional func outlineView(_ outlineView: NSOutlineView,
             objectValueFor tableColumn: NSTableColumn?,
                            byItem item: Any?) -> Any?


但是,Apple的documentation指出:


  虽然此方法在协议中标记为@optional,但如果不使用Cocoa绑定为大纲视图提供数据,则必须实现此方法。


对于本教程,似乎没有该方法就可以工作。但是,那有什么好处呢?应该如何使用呢?

(令我困惑的是,它的读取就像应该返回一个数据对象一样,但是它被传递了一个item参数作为输入,据我所知这是一个数据对象。)

最佳答案

NSTableView / NSOutlineView及其文档很乱。

byItemoutlineView(_:objectForValue:byItem:)参数是该行表示的对象,返回值是该单元格表示的对象。比较tableView(_:objectValueFor:row:)返回值是


  视图的指定表列中数据源中的一项。


另见the objectValue property of NSTableCellView


  表示单元格数据的对象。
  
  使用绑定时,表会自动设置objectValue,或者是NSTableViewDataSource协议方法tableView(_:objectValueFor:row :)返回的对象。


实际上,绑定表视图内容时,objectValue是行对象。

NSOutlineView.h关于outlineView(_:objectValueFor:byItem:)说:


  注意:此方法对于基于视图的OutlineView是可选的。


苹果的文档


  虽然此方法在协议中标记为@optional,但是如果不使用Cocoa绑定为大纲视图提供数据,则必须实现此方法。


仅对基于单元格的轮廓视图有效。

如果在outlineView(_:viewFor:item:)中的单元格中设置控件的值,则不必实现outlineView(_:objectValueFor:byItem:)

如果要使用单元格视图的outlineView(_:objectValueFor:byItem:)属性,请实现objectValue。例如,当绑定单元格中控件的值而不绑定大纲视图的内容时。

另见Populating a Table View Programmatically

关于macos - 我真的需要实现outlineView(_:objectForValue:byItem :)吗?怎么样?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55557440/

10-09 16:25