在 plist 中保存单个 NSMutableDictionary
Posted
技术标签:
【中文标题】在 plist 中保存单个 NSMutableDictionary【英文标题】:Saving a single NSMutableDictionary in a plist 【发布时间】:2010-03-11 04:09:28 【问题描述】:我有一本字典需要保存到 plist 中。调色板字典总是返回 nil:
- (void)saveUserPalette:(id) sender
[paletteDictionary setObject:matchedPaletteColor1Array forKey:@"1"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"UserPaletteData.plist"];
// write plist to disk
[paletteDictionary writeToFile:path atomically:YES];
我正在以不同的视图读取数据,例如:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"UserPaletteData.plist"];
NSMutableDictionary *plistDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:path];
if(plistDictionary==nil )
NSLog(@"failed to retrieve dictionary from disk");
【问题讨论】:
错误是什么?代码看起来没问题。 没有错误,但 plistDictionary 仍然为零记录错误“无法从磁盘检索字典”。 您可以编辑您的问题以提及这一点吗? 【参考方案1】:你能说一下“matchedPaletteColor1Array”是什么对象吗?我相信,它是一些自定义类对象。据我所知,可写对象必须符合 NSCoding,NSString、NSDate 等已经符合,所以在给定的代码中,将“matchedPaletteColor1Array”设置为某个字符串将起作用。
您可以查看以下帖子以启用您的对象 NSCoding。 objects conforming to nscoding will not writetofile
【讨论】:
【参考方案2】:在模拟器中运行您的应用程序并浏览到以下路径:
~/Library/Application Support/iPhone Simulator/User/Applications/A GUID/Documents
其中 GUID 将是这样的字符串:06430A38-AFAC-4C68-8F39-DBD6C81A5AA6(它可能是 Last Modified 文件夹)。
验证 UserPaletteData.plist 是否存在并将其加载到 Property List Editor.app 以验证它是否包含一些数据。
还要确保您在字典中仅使用以下数据类型,否则它将无法写入 plist:(NSData、NSDate、NSNumber、NSString、NSArray 或 NSDictionary)。
要验证您尝试保存到磁盘的字典对于 plist 是否有效,请尝试以下操作:
for (id key in paletteDictionary)
NSLog(@"key: %@, value: %@, class: %@", key, [paletteDictionary objectForKey:key], NSStringFromClass([[paletteDictionary objectForKey:key] class]));
这应该告诉您是否有任何对象是 plist 的错误数据类型。
如果这仍然没有帮助,那么您应该确保在调用 saveUserPalette 之前已经分配/初始化了 paletteDictionary。
【讨论】:
UserPaletteData.plist 不存在。 我目前只将一个数组保存到字典中。该数组只包含字符串。 你能确认paletteDictionary不是== nil吗?【参考方案3】:在使用之前检查您是否正在分配 (alloc/init) 调色板字典。
【讨论】:
以上是关于在 plist 中保存单个 NSMutableDictionary的主要内容,如果未能解决你的问题,请参考以下文章