如何在 NSUserDefaults 中绑定 NSDictionary 中的对象?

Posted

技术标签:

【中文标题】如何在 NSUserDefaults 中绑定 NSDictionary 中的对象?【英文标题】:How to bind objects in NSDictionary in NSUserDefaults? 【发布时间】:2011-11-10 13:26:20 【问题描述】:

如何将 NSDictionary 对象绑定到 Interface Builder 中的多个文本字段?

我想将每个对象绑定到字典中的特定项目。例如,第一个文本字段应该绑定到 Actor:

【问题讨论】:

8 年后这很荒谬,但请检查答案,接受的一个是错误的,但来自@keeluu 的那个是正确的。干杯:9 【参考方案1】:

您需要在 Interface Builder 中添加一个 NSObjectController。在属性检查器选项卡中,将标准模式“类”和类名保留在“NSMutableDictionary”上,但打开“准备内容”。在绑定检查器中,将“内容对象”绑定到“共享用户默认控制器”,控制器键“值”和“模型键路径”绑定到用户默认值中的字典键。打开“将内容作为复合值处理”。

现在您可以绑定文本字段(或复选框等)。 ObjectController 的值,带有控制器键“选择”(!)和字典中的键(作为模型键路径)。

希望这会有所帮助。我在 Apple 的文档和网络中都找不到答案,很幸运通过尝试不同的控制器对象自己找到了答案...

【讨论】:

刚刚试了一下。它的工作原理是从用户默认值正确加载到 UI 中。但是当这些值发生变化时,这些变化不会像我期望的那样传播回用户默认值。知道为什么吗? 想通了。在下面添加了一个答案以进行详细说明。【参考方案2】:

首先:@keeluu 的答案应该被标记为正确。

以编程方式进行

如果您在代码中而不是通过 IB 执行此操作,则需要注意一个“问题”。它看起来像这样:

// 假设 'anObjectController' 是一个 NSObjectController。 // 假设 'userDefaultsController' 是 [NSUserDefaultsController sharedUserDefaultsController] // 假设 'someDictionary' 是 userDefaults 中的 NSDictionary。 [self.anObjectController 绑定:NSContentBinding toObject:userDefaultsController withKeyPath:@"values.someDictionary" 选项:@NSHandlesContentAsCompoundValueBindingOption:@YES];

如果您执行上述操作,您会发现当您将 UI 元素绑定到 someDictionary 中的属性时,这些 UI 元素将正确显示 IN 用户默认值,但是当您更改它们时(比如说,单击绑定复选框)这些值将不会在用户默认值中更新;旧的价值观依然存在。

原因

绑定必须是NSContentObjectBinding 而不是NSContentBinding。 NSObjectController 类公开了一个名为contentObject 的绑定。当你绑定到它时,一切都会正常工作。

这是一个容易犯的错误,因为 Xcode 的代码自动补全会自动使用 NSContentBinding 并且无论如何它都是最常用的绑定名称之一。这只是给我带来了几个小时的麻烦,所以希望我节省了其他人一些时间。

【讨论】:

知道如何绑定到嵌套字典吗?例如这不起作用:[myButton bind:@"value" toObject:self. anObjectController withKeyPath:@"selection.key1.key2" options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"NSContinuouslyUpdatesValue"]];当我使用 @"selection.key1" 作为 keyPath 时,它工作正常。但我需要深入了解字典。 您需要一组嵌套的对象控制器。每个级别一个。【参考方案3】:

尝试将NSDictionaryController 添加到您的.xib 文件中,然后将其控制器内容绑定到用户默认值中的字典。然后您可以将文本字段值绑定到 Dictionary Controller(arrangedObjects 键)。

我从未尝试过,但我认为它必须有效。

希望,它会有所帮助。

【讨论】:

是的,这正是我现在正在尝试的。但是我需要将 NSDictionary 的特定项目绑定到不同的文本字段。所以我想知道我是否应该按照您的建议在 ControllerKey = "Arranged Objects" 旁边使用模型键路径。谢谢 到目前为止我已经尝试过了,但它不起作用。但我猜模型键路径不是存储在 NSDictionary 中的项目的名称。

以上是关于如何在 NSUserDefaults 中绑定 NSDictionary 中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

从表视图中删除行 | NSUserDefaults + NSKeyedArchiver

NSUserDefaults是否与捆绑标识符绑定?

无法更新 NSUserDefaults 中字典的键值

NSUserDefaults setObject:forKey 死锁?

如何在未绑定的 xml 结构中生成逗号分隔的字符串

如何在swift中保存NSUserDefaults中的颜色?