10

我有一个简单的模型Foo,它代表用户偏好并封装了一个NSString和一个NSNumber. 我想Foo在用户默认值中存储一个 's 数组,以便它们在应用程序启动之间持续存在;我想在表格视图中显示它们,以便用户可以添加、删除和编辑它们。使用绑定的解决方案似乎非常简单,但事实证明我无法真正开始工作。

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

Foo当从数组中添加和删除 '时,这非常有效——foos用户默认值中的键被更新以反映数组的新内容。问题是对个人属性的更改Foo不会类似地触发将数组写回用户默认值。我相信原因在'<a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVODependentKeys.html#//apple_ref/doc/ uid/20002179-SW5" rel="nofollow noreferrer">Key-Value Observing Programming Guide 中“注册依赖键”的多对多关系部分:观察到对数组控制器的数组本身的更改,但对包含的元素不是。

尽管认识到这是一个问题,但我终其一生都无法弄清楚为了完成这项工作而实际做什么。当我观察到Foo什么对象发生变化时,我需要通知什么消息,以便将整个数组写回用户默认值——<code>NSUserDefaults, NSUserDefaultsController, NSArrayController? 我希望 Apple 文档不仅仅粗略地提到这个问题,并提供了一些实际的示例代码来解决它——我已经尝试了所有方法,但我找不到魔法咒语。

这类似于如何通过 NSArrayController 获得模型更改通知,但我无法在他使用自定义视图所做的事情和使用bind:toObject:withKeyPath:options:.

谢谢!:)

4

1 回答 1

0

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

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

假设我了解这种情况,并且正如您所说,修改数组本身(即在 'foos' 中添加/删除 Foo 已成功发出更改信号,显然您需要做的就是表明 foos 已经更新单个属性时随时更新。

为此,您只需在任何属性更改时触发 KVO 通知。基本上,您将覆盖 Foo 中的设置器 - 对于您关心观察的任何属性。并在那里发送通知。

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

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

但在您的情况下,您想发送属性“foos”已更改的通知。它不是 Foo 的属性。没有什么说通知必须只针对特定属性(或者至少我不知道)。但是,您可能不希望 Foo 知道它是在其他地方的 'foos' 属性中组成的。

那么,直接使用 NSNotification 怎么样?创建一个通用方法来触发 Foo 内的“Foo”更新通知 - 子类化您的设置器,然后在您修改 Foo 属性时触发此通知。

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

于 2013-10-26T19:37:16.280 回答