绑定到NSArrayController的可编辑表视图绑定到NSUserDefaultsController

时间:2013-05-10 16:08:54

标签: objective-c cocoa nsuserdefaults cocoa-bindings nsarraycontroller

我有一个简单的模型Foo,它代表用户偏好并封装了NSStringNSNumber。我想在用户默认值中存储一个Foo数组,以便它们在启动应用程序之间保持不变;我想在表格视图中显示它们,以便用户可以添加,删除和编辑它们。对于这个问题的解决方案看起来非常简单,但事实证明我无法真正开始工作。

当我的应用程序启动时,我向NSUserDefaults注册了一个初始Foo数组的键控存档。在我的XIB中,我有一个数组控制器,其内容数组绑定到共享用户默认控制器的values控制器键;关键路径为foos; “检查内容为复合值”;和NSKeyedUnarchiveFromData作为值变换器。然后,表视图又绑定到数组控制器,并将表的列绑定到Foo的属性。

当添加Foo并从数组中删除时,这非常有效 - 用户默认值中的foos键被更新以反映数组的新内容。问题是对单个Foo的属性的更改不会类似地触发将数组写回用户默认值。我相信其原因在Key-Value Observing Programming Guide中的'Registering Dependent Keys'的'To-many Relationships'部分中进行了讨论:观察到对阵列控制器数组本身的更改,但是对包含的属性的更改元素不是。

尽管认识到这是一个问题我不能为我的生活找出实际做的事情,以使这项工作。当我观察Foo上的更改时,我需要通知哪些对象以及将整个数组写回用户默认值的消息 - NSUserDefaultsNSUserDefaultsController,{{1 }}?我希望Apple文档不仅仅是粗略地提到这个问题,并提供了一些实际的示例代码来解决它 - 我已经尝试了一切,我找不到神奇的咒语。

这与How to get notified of changes to models via an NSArrayController类似,但我无法在他使用自定义视图和使用NSArrayController之间实现概念上的飞跃。

谢谢! :)

1 个答案:

答案 0 :(得分:0)

我是iOS开发人员,请原谅我,如果由于iOS不支持Cocoa绑定而导致我缺少某些方面。

我无法确定,但听起来好像你想要在任何Foo的任何属性被修改时获得通知,这样你就可以发出对你的foos数组的更改信号,从而让NSUserDefaults刷新保存的数组。这是对的吗?

假设我理解了这个场景,并且正如你所说的那样,修改阵列本身(即在'foos'中添加/删除Foo是成功发出变化的信号,很明显你需要做的就是发出信号foos已在个人财产更新时更新。

要做到这一点,您只需在任何属性更改时触发KVO通知。基本上你会覆盖你在Foo中的setter - 对于你关心观察的任何属性。并在那里发送通知。

但是你怎么做到这一点?发送KVO通知的常用模式如下(对于名为openingBalance的属性:

[self willChangeValueForKey:@"openingBalance"];
_openingBalance = theBalance;
[self didChangeValueForKey:@"openingBalance"];

但在您的情况下,您希望发送有关“foos”属性已更改的通知。它不是Foo的财产。没有任何内容表明通知必须仅针对特定属性(或者至少是我所知道的)。但是,你可能不希望Foo知道它是在其他地方的'foos'属性中组成的。

那么,如何直接使用NSNotification呢?创建一个通用方法来触发Foo中的'Foo'更新通知 - 将您的setter子类化,然后在修改Foo属性时触发此通知。

反过来,在拥有'foos'的对象内部订阅此通知,并直接更新NSUserDefaults,或者从那里开始为那里的'foos'发送KVO通知。