我有一个简单的模型Foo
,它代表用户偏好并封装了NSString
和NSNumber
。我想在用户默认值中存储一个Foo
数组,以便它们在启动应用程序之间保持不变;我想在表格视图中显示它们,以便用户可以添加,删除和编辑它们。对于这个问题的解决方案看起来非常简单,但事实证明我无法真正开始工作。
当我的应用程序启动时,我向NSUserDefaults
注册了一个初始Foo
数组的键控存档。在我的XIB中,我有一个数组控制器,其内容数组绑定到共享用户默认控制器的values
控制器键;关键路径为foos
; “检查内容为复合值”;和NSKeyedUnarchiveFromData
作为值变换器。然后,表视图又绑定到数组控制器,并将表的列绑定到Foo
的属性。
当添加Foo
并从数组中删除时,这非常有效 - 用户默认值中的foos
键被更新以反映数组的新内容。问题是对单个Foo
的属性的更改不会类似地触发将数组写回用户默认值。我相信其原因在Key-Value Observing Programming Guide中的'Registering Dependent Keys'的'To-many Relationships'部分中进行了讨论:观察到对阵列控制器数组本身的更改,但是对包含的属性的更改元素不是。
尽管认识到这是一个问题我不能为我的生活找出实际做的事情,以使这项工作。当我观察Foo
上的更改时,我需要通知哪些对象以及将整个数组写回用户默认值的消息 - NSUserDefaults
,NSUserDefaultsController
,{{1 }}?我希望Apple文档不仅仅是粗略地提到这个问题,并提供了一些实际的示例代码来解决它 - 我已经尝试了一切,我找不到神奇的咒语。
这与How to get notified of changes to models via an NSArrayController类似,但我无法在他使用自定义视图和使用NSArrayController
之间实现概念上的飞跃。
谢谢! :)
答案 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通知。