如何使用“将内容处理为复合值”来维护TableView选择

时间:2017-09-25 19:07:43

标签: xcode macos checkbox binding nstableview

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

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

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

我期望发生的事情是检查/取消选中该框不应影响所选行(突出显示)。

enter image description here

ArrayController名为'ModifiersController',其Content Array绑定到名为User Defaults Controller的{​​{1}}键。 MinimizeModifiers是带有自定义MinimizeModifiers的值字典。因此,我启用了将内容处理为复合值

的复选框

arraycontroller_bindings

处理内容为复合值 关闭(禁用)时,表中的选择被正确维护,但底层代码(绑定到UserDefaults)不起作用。

处理内容为复合值 时,UI元素值已正确绑定到UserDefaults,但是,这似乎会导致表格失去当前的选择

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

附录

tableView绑定到Value Transformer,并且数组控制器设置为selectionIndexes(我也尝试关闭preserve selection,并且打开和关闭“避免空选择” - 没有成功)。

selectionIndexes_bind

arraycontroller_preserve

迷你电影的链接显示问题(如果允许)...... https://www.rgbworld.com/images/stackoverflow/selection.m4v

Addendum2

我已将代码更新为Xcode 9和Swift 4,问题仍然存在。我认为这个问题可能与我使用KVO和/或使用支持变量用于我的preserve selection

有关

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

Githib Repo

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

1 个答案:

答案 0 :(得分:1)

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

解决方案:在isEqual(_:)中实施ModifiersRuleTransformer

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