在 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的主要内容,如果未能解决你的问题,请参考以下文章

在swiftui中保存照片?

如何在 PostgreSQL 中保存生日日期?

在 UserDefaults 中保存项目数组 - iOS 12

OpenCV:在 IYUV 中保存视频

如何以编程方式在 iOS 5 中保存生日日期

在 Metro Style 应用程序中保存本地数据