如何使用 "Handles Content As Compound Value" 维护 TableView 选择

How to maintain TableView selection with "Handles Content As Compound Value"

我在 NSTableView 上维护选择时遇到问题。我正在使用 xCode 8.3.3 和 Swift 3.1 并为 macOS 构建。

基于单元格的 table 视图是在 IB 中创建的,并且在 table 的第一列中有一个 NSButtonCell(复选框)。此列绑定到 ModifiersController.arrangedObjects.enabled。复选框按预期运行,这意味着它可以正确选中和取消选中。

问题是,当我通过单击更改复选框的状态时,所选行变为未选中状态,第一行变为选中状态。无论我更改复选框时选择了哪一行,它始终是第一行被选中。

我希望发生的是 checking/unchecking 该框不应影响选定的行(突出显示)。

ArrayController 名为 'ModifiersController',其 Content Array 绑定到名为 MinimizeModifiersUser Defaults Controller 键。 MinimizeModifiers 是具有自定义 Value Transformer 的值字典。因此,我启用了 Handles Content As Compound Value

的复选框

Handles Content As Compound Valueoff(禁用)时,table 中的选择将得到正确维护,但底层代码(绑定到 UserDefaults)不起作用。

Handles Content As Compound Valueon 时,UI 元素值正确绑定到 UserDefaults,但是, 这就是导致 table 失去当前选择的原因

所以,问题是: 当启用 将内容作为复合值 处理时,如何保持 table 行选择?

附录

tableView 绑定到 selectionIndexes 并且数组控制器设置为 preserve selection(我也尝试过关闭 preserve selection,并关闭 'Avoid empty selection' 打开和关闭 - 没有成功)。

还有一个 link 显示问题的迷你电影(如果允许的话)... https://www.rgbworld.com/images/Whosebug/selection.m4v

附录2

我已将代码更新为 Xcode 9 和 Swift 4,但问题仍然存在。我相信这个问题可能与我使用 KVO and/or use of backing variables for use with my @objc dynamic vars

有关

我已经创建了一个 github 存储库以防有人提供帮助。我将为帮助我解决此问题的开发人员增加赏金。

Githib 回购

https://github.com/rgbworld/CompoundTransformer https://github.com/rgbworld/CompoundTransformer

复选框的动作触发用户默认控制器保存数据。用户默认值的更改会触发 table 视图的刷新。所选行未恢复。

解决方案:在 ModifiersRuleTransformer.

中实施 isEqual(_:)

更多信息:How to make NSArrayController preservesSelection work for custom object?