如何通过plist文件创建NSMutableArray?

时间:2013-07-09 04:43:48

标签: ios objective-c nsmutablearray plist

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

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

有没有解决这个问题的方案?我做错了吗?

2 个答案:

答案 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]);
    }
}