writeToFile 输出 .plist 没有写入正确的值

Posted

技术标签:

【中文标题】writeToFile 输出 .plist 没有写入正确的值【英文标题】:writeToFile Output .plist not writing correct values 【发布时间】:2010-06-21 14:41:24 【问题描述】:

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

我的原始 plist 文件是一个大字典数组 (dataArray),每个字典中只有两个字段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] 成功状态(空) 2010-07-06 16:22:42.805 CampingChecklist[400:207] IF 声明阅读文件 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

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

如果有人能阐明这个问题,我将不胜感激。

谢谢 布拉德

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于writeToFile 输出 .plist 没有写入正确的值的主要内容,如果未能解决你的问题,请参考以下文章

writeToFile:atomically: 不保存新的 plist 数据

pList writeToFile 字典数组 - 仅写入最后一个数组条目

writeToFile 不适用于 NSDictionary [重复]

增量写入 plist 文件

SWIFT:初始写入/删除后无法删除 Plist 文件

如何使用 plist 在 UITextView 中检索短信?