以前,我使用以下代码为我创建一个数组并且它有效。
bundle = [NSBundle mainBundle];
path = [bundle pathForResource:@"MultiSetting" ofType:@"plist"];
settingArray = [[NSMutableArray alloc] initWithContentsOfFile:path];
但在那之后,我想修改plist文件,因此,我使用以下代码来执行此操作,但它无法正常工作。
NSFileManager *mgr = [NSFileManager defaultManager];
NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [documentPath objectAtIndex:0];
NSString *dstPath = [documentDirectory stringByAppendingPathComponent:@"MultiSetting.plist"];
bundle = [NSBundle mainBundle];
NSString *srcPath = [bundle pathForResource:@"MultiSetting" ofType:@"plist"];
NSError *error = nil;
[mgr copyItemAtPath:srcPath toPath:dstPath error:(NSError **)error];
settingArray = [[NSMutableArray alloc] initWithContentsOfFile:dstPath];
NSLog(@"%@", settingArray);
有没有解决这个问题的方案?我做错了吗?
答案 0 :(得分:0)
您对settingArray
阵列所做的任何更改都不会自动保存到磁盘。您需要将其明确保存到磁盘。当您确实要保存settingArray
变量的内容时,需要调用:
[settingArray writeToFile:dstPath atomically: YES];
答案 1 :(得分:0)
首先你传递error
错误。您需要将该行更改为
[mgr copyItemAtPath:srcPath toPath:dstPath error:&error];
根据您的代码在第一次运行后的另一件事,上面的行将失败,因为已经有一个特定名称的文件。如果你只想初始化一次那么我想你可以写下面更合理的东西:
NSError *error = nil;
if (![mgr fileExistsAtPath:dstPath]) {
[mgr copyItemAtPath:srcPath toPath:dstPath error:&error];
if (error) {
NSLog(@"%@",[error localizedDescription]);
}
}
最后initWithContentsOfFile:
可能会失败,因为plist无法解析为数组。这可能是因为plist文件的根对象是字典(使用Xcode创建plist时的默认值)。
由于你能够在bundle中解析plist文件,可能是因为你可能第一次意外地复制了错误的文件(或者是一个空文件或带有root作为字典的plist)然后无法复制。因此,请尝试从dstPath
删除该文件,然后重试。
要检查文件,请执行NSLog
dstPath
。例如,如果你在控制台中得到这样的东西:
/Users/xxxx/Library/Application Support/iPhone Simulator/5.0/Applications/194351E6-C64E-4CE6-8C82-8F66C8BFFAAF/Documents/YourAppName.app
将其复制到Documents文件夹,即
/Users/xxxx/Library/Application Support/iPhone Simulator/5.0/Applications/194351E6-C64E-4CE6-8C82-8F66C8BFFAAF/Documents/
转到:
Finder - >去 - >转到文件夹
并粘贴路径并点击Go
。这应该会带您到实际目录并检查plist的内容。在Xcode中将其作为源代码打开,以查看根对象是什么。
同时尝试删除此处找到的文件并运行您的应用程序。
实现上述目标的另一种方法是从bundle初始化数组然后直接写入而不是复制文件(但这不是你的问题的直接答案只是一种解决方法),即:
NSString *srcPath = [bundle pathForResource:@"MultiSetting" ofType:@"plist"];
NSError *error = nil;
//initialize from source
NSMutableArray *settingsArray = [[NSMutableArray alloc] initWithContentsOfFile:srcPath];
//write to file
NSError *error = nil;
//check if file exists
if (![mgr fileExistsAtPath:dstPath]) {
[settingArray writeToFile:dstPath atomically: YES];
if (error) {
NSLog(@"%@",[error localizedDescription]);
}
}