-1

以前,我使用以下代码为我创建了一个数组,并且它有效。

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);

有什么办法可以解决这个问题吗?我做错什么了吗?

4

2 回答 2

0

您对settingArray阵列所做的任何更改都不会自动保存到磁盘。您需要将其显式保存到磁盘。当你真正想保存settingArray变量的内容时,你需要调用:

[settingArray writeToFile:dstPath atomically: YES];
于 2013-07-09T05:10:06.933 回答
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 时的默认值)。

由于您能够解析捆绑中的 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]);
    }
}
于 2013-07-09T06:44:18.677 回答