如何在 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