【问题标题】:Do I really need to implement outlineView(_:objectForValue:byItem:)? How?我真的需要实现outlineView(_:objectForValue:byItem:)吗?如何?
【发布时间】:2019-08-28 15:49:12
【问题描述】:

我想不使用使用 Cocoa 绑定来实现大纲视图。

我查看了this tutorial 等,但没有一个使用数据源方法

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

不过,Apple 的 documentation 声明:

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

对于教程,如果没有这种方法,它似乎也可以工作。 那么它有什么用,应该如何使用呢?

(让我感到困惑的是,它读起来像是应该返回一个数据对象,但它被传递了一个item 参数作为输入,在我的理解中一个数据对象。)

【问题讨论】:

    标签: macos cocoa nsoutlineview


    【解决方案1】:

    NSTableView/NSOutlineView 及其文档一团糟。

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

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

    另见the objectValue property of NSTableCellView

    表示单元格数据的对象。

    objectValue在使用绑定时由table自动设置或者是NSTableViewDataSource协议方法tableView(_:objectValueFor:row:)返回的对象。

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

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

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

    Apple 的文档

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

    仅对基于单元格的大纲视图有效。

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

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

    另见Populating a Table View Programmatically

    【讨论】:

    • NSTableView/NSOutlineView 及其文档一团糟。 → 不开玩笑...感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 2011-05-18
    • 2012-03-13
    • 2020-01-29
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多