写入文档目录中的 plist 时出错
Posted
技术标签:
【中文标题】写入文档目录中的 plist 时出错【英文标题】:Error writing to plist in documents directory 【发布时间】:2012-09-07 05:41:59 【问题描述】:我使用以下代码将 Resources plist 文件复制到文档目录中:
BOOL success;
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Test-Info.plist"];
success = [fileManager fileExistsAtPath:filePath];
if (!success)
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@"Test-Info.plist"];
success = [fileManager copyItemAtPath:path toPath:filePath error:&error];
NSLog(@"Test-Info.plist successfully copied to DocumentsDirectory.");
我收到了成功消息,这很好。我假设它已正确复制到文档文件夹中。
但是,当我尝试读取和写入保存的 plist 文件时,它返回 null:
Test-Info.plist 中的关键条目:
Key: EnableEverything
Type: Boolean
Value: YES
编写代码:
NSString *adKey = @"EnableEverything";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:@"Test-Info.plist"];
NSMutableDictionary *plist = [NSDictionary dictionaryWithContentsOfFile: path];
NSString *enableEverything = [[plist valueForKey:adKey] stringValue];
NSLog(@"****** EXISTING: %@ ******", enableEverything); // returns (null)
// Disable in plist.
[plist setValue:0 forKey:adKey]; // will this work?
[plist writeToFile:path atomically:YES]; // this doesn't throw an error?
NSString *enableEverything1 = [[plist valueForKey:adKey] stringValue];
NSLog(@"****** NOW: %@ ******", enableEverything1); // returns (null)
输出:
****** EXISTING: (null) ******
****** NOW: (null) ******
我的问题是,当它们存在于 plist 文件中时,为什么它们是 (null)
?
【问题讨论】:
【参考方案1】:你正试图改变一个不可变的对象。
您需要NSMutableDictionary。
IE
NSMutableDictionary *plist = [[NSDictionary dictionaryWithContentsOfFile: path] mutableCopy];
还要检查,如果 plist 对象不是 nil,因为任何消息都可以发送到 nil 而不会出现错误。这不会失败,实际上也没有发生任何事情。
[plist setValue:0 forKey:adKey]; // will this work?
[plist writeToFile:path atomically:YES]; // this doesn't throw an error?
由于源路径为 nil,您最喜欢在 编译 捆绑期间不复制文件。把它拖到这里:
【讨论】:
顺便说一句:为什么文件的麻烦?它似乎是 NSUserDefaults 的完美用例 这就是问题所在。谢谢一百万。 :) 一小时。该死的,我应该在那个小时工作并为此向客户收费…… 在我的情况下,我必须从我的文档目录中删除 plist,以便它在我构建后写入我的新值。【参考方案2】:试试这个资源的 nsbundle 路径
NSString *path= [[NSBundle mainBundle] pathForResource:@"SportsLogo-Info" ofType:@"plist"];
尝试分配
NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithDictionary:[NSDictionary dictionaryWithContentsOfFile:path]];
还要检查文件是否已被复制。转到Library=>Application Support=>iPhone Simulator=>文件夹命名您的模拟器ios版本=>Applications=>找到您项目的正确文件夹=>Documents查看plist文件是否存在
【讨论】:
NSMutableDictionary *plist = [NSDictionary dictionaryWithContentsOfFile: path];
有什么问题? (除了它需要是可变的)
我同意,但是它仍然返回 nil。
实际上,我并没有检查 DocumentsDirectory。 Neo是对的,它不存在,所以它没有被复制。问题是,为什么没有成功复制到 DocumentsDirectory?
你的意思是 SportsLogo-Info.plist 没有退出或者源路径不对?
可能它没有复制到包中。看看我的回答怎么做。以上是关于写入文档目录中的 plist 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSMutableDictionary 写入 Plist