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

问题描述 投票:5回答:3

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

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

cocoa interface-builder nsdictionary nsuserdefaults cocoa-bindings
3个回答
-1
投票

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

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

希望能帮助到你。


4
投票

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

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

希望这可以帮助。我在Apple的文档中找不到答案,也没有在网上找到答案,幸运的是通过尝试不同的控制器对象来找到答案...


2
投票

第一:@ keeluu的答案应该标记正确。

以编程方式进行

如果你是在代码中而不是通过IB执行此操作,那么需要注意“陷阱”。它看起来像这样:

// Assume 'anObjectController' is an NSObjectController.
// Assume 'userDefaultsController' is [NSUserDefaultsController sharedUserDefaultsController]
// Assume 'someDictionary' is an NSDictionary in userDefaults. 

[self.anObjectController 
    bind:NSContentBinding 
    toObject:userDefaultsController 
    withKeyPath:@"values.someDictionary"
    options:@{NSHandlesContentAsCompoundValueBindingOption: @YES}];

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

The Reason

绑定必须是NSContentObjectBinding而不是NSContentBinding。 NSObjectController类公开名为contentObject的绑定。绑定到那个,一切正常。

这是一个容易犯的错误,因为Xcode的代码完成自动进入NSContentBinding,无论如何它是最常用的绑定名称之一。这只花了我几个小时的麻烦,所以希望我能节省一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.