绑定到NSArrayController的NSTableVIew不保存更改

时间:2015-03-02 22:05:39

标签: nsuserdefaults nstableview nsarraycontroller

我有一个非常简单的项目,其中包含一个带有3列的NSTableView和用于添加新行,删除行和保存数据的按钮。

出于本项目的目的,我想将值保存到NSUserDefaults数据库中并且无需编码即可完成所有这些操作,因此IB连接和属性如下:

通过IB添加了Array Controller对象。其Controller内容绑定到共享用户默认值控制器(控制器密钥:值,模型密钥路径:myvalues),将内容处理为复合值检查。

添加了表视图集以包含3列并设置为基于视图。

对于表视图本身,其内容绑定到Array Controller(Controller Key arrangeObjects),其选择索引绑定到Array Controller(Controller Key selectionIndexes)

对于表的每一列,表视图单元格项(链中的第三个)值绑定到表单元格视图(控制器键为空,模型键路径设置为objectValue.xxxx,其中xxxx是列的任意名称字符串);此外,Behavior属性设置为" editable"。

添加行和删除行按钮发送的操作连接到Array Controller添加和删除方法,Save按钮发送操作链接到共享用户默认值保存方法。

当我运行项目时,我最初可以做"添加",输入列的值,单击保存,结束执行,当我重新运行它时,显示数据。但是,如果我然后尝试更改任何数据,则不会保留更改。如果我添加其他行,并输入数据不保留数据(行将在那里,只是空)。删除行按预期工作。 (注意:如果我在初始执行时添加了几行,只有第一行会有后续执行的数据)

我的问题是:为什么数据不会改变(在第一次之后)工作?似乎某处缺少一层。

我创建了第二个项目,与第一个项目非常相似,但指定了基于单元格的表而不是基于视图的项目;对于表视图,绑定更简单,没有绑定,只是将表单元格值直接绑定到数组控制器。这个项目很完美。可以编辑单元数据,输入新行数据等

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:-1)

由于基于单元格的表按预期工作,没有编码,我现在将使用它。至于使基于视图的表正常工作,看起来(来自Ken的注释和其他SO线程)托管内容可能正在正确更新,但用户默认控制器没有意识到这些更改。因此,一个简单的解决方法是添加几行代码,例如在AppDelegate applicationWillTerminate方法中:

let ac : NSArray = arrayController!.arrangedObjects as NSArray
NSUserDefaults.standardUserDefaults().setObject(ac, forKey: "myvalues")

其中arrayController是IB Array Controller的插座。

(这有点过分,因为它会在每次应用程序运行时设置对象,但您也可以将SAVE按钮连接到设置Bool的方法,然后在请求的SAVE上有条件地发出setObject。)