writeToFile输出.plist不写正确的值

时间:2010-06-21 14:41:24

标签: iphone xcode plist tableview

我一直在尝试编写一个简单的购物清单程序但是当我尝试将修改后的值写回plist文件时,我只能获得文件中的原始值。

我的原始plist文件是一个大型数组(dataArray)的字典,每个字典中只有两个字段,一个bool和一个字符串,当你在tableview中选择一个项目时,bool值会针对单个项目进行更改,当我输出时dataArray到控制台我可以看到值已被更改,我唯一的问题是,当我尝试将dataArray写入文件时,我获取文件目录中的文件,但所有bool值仍然关闭。

- (void)viewDidLoad {

 //load from plist file
 NSString *path = [[NSBundle mainBundle] pathForResource:@"OriginalChecklist" ofType:@"plist"];
 self.dataArray = [NSMutableArray arrayWithContentsOfFile:path];

    [super viewDidLoad];
}

- (void)viewWillDisappear:(BOOL)animated 
{
 NSString *documentsDirectory = [@"~/Documents/" stringByExpandingTildeInPath];
 NSString *savePath = [documentsDirectory stringByAppendingPathComponent:@"Checklist.plist"];
 [dataArray writeToFile:savePath atomically:YES];

 NSLog(@"location information %@", savePath); 
 NSLog(@"dataAray contents %@=", dataArray);
}

正如我所说,当我将dataArray的结果输出到控制台时,我从我检查的项目中得到以下结果。

cell = <UITableViewCell: 0x3b143d0; frame = (0 0; 320 44); text = 'Water Bottle'; autoresize = W; layer = <CALayer: 0x3b14650>>;
checked = 1;
text = "Water Bottle";

cell = <UITableViewCell: 0x3b20560; frame = (0 88; 320 44); text = 'GPS'; autoresize = W; layer = <CALayer: 0x3b20610>>;
checked = 1;
text = GPS;

如果有人知道如何将修改后的结果保存到plist文件中,我将非常感谢您的帮助。

由于 布拉德


我的应用程序能够创建一个plist并在ViewDidLoad部分中加载来自该plist的信息,我仍然遇到一些麻烦。我正在使用的代码检查原始文件,如果不存在则创建一个如下

(void)viewDidLoad {

BOOL success;

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"CustomChecklist.plist"];

success = [fileManager fileExistsAtPath:filePath];
NSLog(@"STATUS OF SUCCESS %@",success);
if (!success) {
    NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@"OriginalChecklist.plist"];
    success = [fileManager copyItemAtPath:path toPath:filePath];
    self.dataArray = [NSMutableArray arrayWithContentsOfFile:filePath];
    NSLog(@"IF STATEMENT CREATING THE FILE");
}else {
    self.dataArray = [NSMutableArray arrayWithContentsOfFile:filePath];
    NSLog(@"IF STATEMENT READING THE FILE");
}

NSLog(@"location information %@", filePath);
[super viewDidLoad];

}

当我构建这个应用程序时,它构建并运行正常,但我收到了一些警告 NSFileManager可能无法响应-copyItemAtPath:toPath

完成此操作后,输出到控制台看起来好像甚至没有检查过该文件或创建了要读取的文件。

2010-07-06 16:22:42.803 CampingChecklist [400:207]成功状态(null) 2010-07-06 16:22:42.805 CampingChecklist [400:207]如果声明正在阅读文件 2010-07-06 16:22:42.814 CampingChecklist [400:207]位置信息/用户/布拉德/图书馆/应用支持/ iPhone模拟器/ 3.1.3 /应用/ E7074D5A-3E7A-4D2E-9F92-82B1A04873F8 / Documents / CustomChecklist的.plist

显然,由于文件中没有任何内容,当它试图在应用程序的路上保存时,它不会在指定的路径中创建任何文件。

如果有人能对这个问题有所了解,那么我会非常感激。

由于 布拉德

1 个答案:

答案 0 :(得分:3)

当您第一次加载plist时,它来自App Bundle - 这是不可写的。

保存数据时,您正确地将其保存到文档目录中。

但是,当您下次再次加载plist时,您将再次从Appe Bundle加载它,但尚未更改。

您需要在plist加载代码中加入一些逻辑,以检查文档目录中文件的存在。如果存在,请加载它,如果没有加载应用程序包中的那个。