Cod*_*ins 9 cocoa objective-c nsuserdefaults nsarraycontroller cocoa-bindings
我有一个Foo代表用户偏好的简单模型,并封装了一个NSString和一个NSNumber.我想Foo在用户默认值中存储一个数组,以便它们在启动应用程序之间保持不变; 我想在表格视图中显示它们,以便用户可以添加,删除和编辑它们.对于这个问题的解决方案看起来非常简单,但事实证明我不可能真正开始工作.
当我的应用程序启动时,我注册了NSUserDefaults一个初始数组的键控存档Foo.在我的XIB中,我有一个数组控制器,其内容数组绑定到共享用户默认控制器的values控制器键; 关键路径foos; "检查内容为复合值"; 并NSKeyedUnarchiveFromData作为价值变换器.然后,表视图又绑定到数组控制器,并将表的列绑定到属性Foo.
当Foo从数组中添加和删除时,这非常有效- foos更新用户默认值中的键以反映数组的新内容.问题是,对个人属性的更改Foo不会类似地触发将数组写回用户默认值.我相信这样做的原因是在"讨论的一对多关系 "的键-值观察编程指南中的"注册相关按键"部分:本身被观察到的变化对阵列控制器的阵列,但更改所包含元素的性质不是.
尽管认识到这是一个问题,但我不能为我的生活找出实际做什么才能使这项工作.当我观察到对某个Foo对象的更改时,我需要通知并使用什么消息将整个数组写回用户默认值NSUserDefaults- NSUserDefaultsController,NSArrayController?我希望Apple文档不仅粗略地提到这个问题,并提供了一些实际的示例代码来解决它 - 我已经尝试了一切,我找不到神奇的咒语.
这类似于如何通过NSArrayController获取模型更改的通知,但我不能在他使用自定义视图和使用它之间进行概念上的飞跃bind:toObject:withKeyPath:options:.
谢谢!:)
我是一名 iOS 开发人员,所以如果由于 iOS 不支持 Cocoa 绑定而导致我遗漏了某些方面,请原谅我。
我无法确定,但听起来好像您希望在修改任何 Foo 的任何属性时收到通知,以便您可以向 foos 数组发出更改信号,从而让 NSUserDefaults 刷新保存的数组。那是对的吗?
假设我理解这种情况,并且考虑到,正如您所说,修改数组本身(即在“foos”内添加/删除 Foo 成功地发出了更改信号,显然您需要做的是发出信号 foos 已被每当更新单个属性时都会更新。
为此,您只需在任何属性更改时触发 KVO 通知即可。基本上,您将覆盖 Foo 内的设置器 - 对于您关心观察的任何属性。并在那里发送通知。
但是你怎么做到这一点呢?发送 KVO 通知的常见模式如下(对于名为 openingBalance 的属性:
[self willChangeValueForKey:@"openingBalance"];
_openingBalance = theBalance;
[self didChangeValueForKey:@"openingBalance"];
Run Code Online (Sandbox Code Playgroud)
但在您的情况下,您想发送属性“foos”已更改的通知。而且它不是 Foo 上的财产。没有任何内容表明通知必须仅针对特定属性(或者至少我不知道)。但是,您可能不希望 Foo 知道它是在其他地方的 'foos' 属性内组成的。
那么,直接使用 NSNotification 怎么样?创建一个通用方法来在 Foo 内触发“Foo”更新通知 - 将您的 setter 子类化,然后在您修改 Foo 属性时触发此通知。
反过来,在拥有“foos”的对象内部订阅此通知,并直接更新 NSUserDefaults,或者从那里触发“foos”的 KVO 通知。
| 归档时间: |
|
| 查看次数: |
397 次 |
| 最近记录: |