在plist中保存单个NSMutableDictionary

时间:2010-03-11 04:09:29

标签: iphone plist nsdictionary

我有一本字典需要保存到plist中。 paletteDictionary总是返回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");
}

3 个答案:

答案 0 :(得分:2)

你能提一下对象是“matchedPaletteColor1Array”吗?我相信,它的一些自定义类对象。据我所知,可写对象必须符合NSCoding,NSString,NSDate等已经存在,所以在给定代码中,将“matchedPaletteColor1Array”设置为某些字符串将起作用。

您可以查看以下帖子,以启用对象NSCoding。 objects conforming to nscoding will not writetofile

答案 1 :(得分:1)

在模拟器中运行您的应用程序并浏览到以下路径:

〜/ 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已经被alloc / init'。

答案 2 :(得分:0)

在使用之前检查您是否正在分配(alloc / init)paletteDictionary。