0

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

我的原始 plist 文件是一个大的字典数组(dataArray),每个字典中只有两个字段,一个布尔值和一个字符串,当您在表格视图中选择一个项目时,布尔值会更改为单个项目,当我将 dataArray 输出到控制台我可以看到该值已更改,我唯一的问题是,当我尝试将 dataArray 写入文件时,我在文档目录中获取该文件,但所有布尔值仍然关闭。

- (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] 成功状态(空) 2010-07-06 16:22:42.805 CampingChecklist[400:207] 如果声明阅读文件 2010-07-06 16: 22:42.814 CampingChecklist[400:207] 位置信息 /Users/Brad/Library/Application Support/iPhone Simulator/3.1.3/Applications/E7074D5A-3E7A-4D2E-9F92-82B1A04873F8/Documents/CustomChecklist.plist

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

如果有人可以阐明这个问题,那么我将不胜感激。

谢谢布拉德

4

1 回答 1

3

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

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

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

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

于 2010-06-21T15:07:26.707 回答