2010-06-21 50 views
0

我一直在试图编写一个简单的购物清单程序,但是当我尝试将修改后的值写回plist文件时,我只获取了文件中的原始值用。writeToFile输出.plist不写入正确的值

我原来的plist文件是一个大型数组(dataArray)的字典,每个字典中只有两个字段,一个布尔值和一个字符串,当你在tableview中选择一个项目时,布尔值被更改为单个项目,当我输出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的信息有点麻烦。我使用目前的代码检查原始文件,如果它不存在创建一个如下

(无效)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] SUCCESS情况(空) 2010-07-06 16:22:42.805 CampingChecklist [400:207] if语句读取文件 2010 -07-06 16:22:42.814 CampingChecklist [400:207]位置信息/用户/布拉德/图书馆/应用支持/ iPhone模拟器/3.1.3/Applications/E7074D5A- 3E7A-4D2E-9F92-82B1A04873F8/Documents/CustomChecklist。 plist

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

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

感谢 布拉德

回答

3

当你加载你的plist首次,它来自应用程序软件包 - 这是不写。

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

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

您需要将一些逻辑放入您的plist加载代码中,以检查文档目录中是否存在该文件。如果存在,则加载它,如果不加载应用程序包中的那个。