【问题标题】:write into plist file using NSDictionary object使用 NSDictionary 对象写入 plist 文件
【发布时间】:2012-02-24 15:44:51
【问题描述】:

抱歉,我看到了类似的问题,但他们似乎没有给我一些完整的答案。我试着把它整理好,这样人们就不会讨厌我或我糟糕的英语。
我正在使用带有故事板和 ARC 的 Xcode 4.2
我可以从我的 plist 文件中读取。我的任务只是将更新后的值写回到我的 plist 文件中。

我的 plist 包含在主文件夹的“支持文件”子文件夹中(故事板所在的位置)。该文件是调用 Global.plist 和 GlobalValue2 是文件类型字符串的一个元素。

所以读取的文件部分是这样的

NSString *plistfile = [[NSBundle mainBundle] pathForResource:@"Global" ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:plistfile];

FirstValueTextBox.text = [[dict valueForKey:@"GlobalValue1"] stringValue];

从一些方便的 youtube 视频中学习就可以了。将值更新到我的文本框。

当我写回我的 plist 文件时,真正的问题出现了。当我尝试以下

NSString *plistfile = [[NSBundle mainBundle] pathForResource:@"Global" ofType:@"plist"];
NSMutableDictionary *dict = [NSMutableDictionary
dictionaryWithContentsOfFile:plistfile];

[dict setValue:@"ABC" forKey:@"GlobalValue2"];
SecondValueTextBox.text = [dict valueForKey:@"GlobalValue2"];
[dict writeToFile:plistfile atomically:YES];

结果是我真的看到第二个文本框弹出了一个更新的值,但 plist 文件保持不变。

以下是我的问题分解和我对问题的猜测

  1. 我尝试使用 NSDictionary(不是 NSMutableDictionary)并调用 setValue(运行时崩溃)
    我的猜测: NSDictionary 对象本身是只读的,所以当我说添加值时它会让我崩溃。但是为什么在编码时它不会出错呢?如果对象是只读的

  2. 我使用 NSMutableDictionary 可以调用 setValue。它不会让我崩溃,当我在 "SecondValueTextBox.text = [dict valueForKey:@"GlobalValue2"];" 调用更新的值时它真的返回了我更新的值。但是 plist 文件中的内容没有改变。这是我现在得到的结果。
    我的猜测:在这里和那里进行一些搜索后,我认为“支持文件”也是只读的。纯粹的猜测确实看到有人直接谈论它。

  3. 我确实尝试过更进一步,有些人谈到 Xcode 中的“文档文件夹”,它是一个读写的地方。我认为人们还谈论编写代码来访问该文件夹。有人可以在这里给我看代码吗?

  4. 我的最后一个问题是,我可以将我的 Xcode 连接到那个“文档文件夹”还是在哪里可以看到它(我认为真正的文件夹结构与 Xcode 内部不同)。这样我就可以查看和编辑我的 plist 文件进行测试,并且我可以在不使用代码和其他东西的情况下看到真实的结果

如果人们能告诉我我的猜测是对是错以及我的第 3 和第 4 个问题的答案,我将不胜感激。

【问题讨论】:

    标签: iphone xcode plist nsdictionary


    【解决方案1】:

    为了让您的更改持久保存在您的 plist 中,您确实需要在启动应用程序时将其从资源包复制到文档目录,然后使用文档中的 plist 进行读写。

    复制文件的方法如下:

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Global.plist"];
    
    if ([fileManager fileExistsAtPath:plistPath] == NO) {
        NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"Global" ofType:@"plist"];
        [fileManager copyItemAtPath:resourcePath toPath:plistPath error:&error];
    }
    

    【讨论】:

    • 对不起,如果这个问题对你们中的任何人来说都是直截了当的。 NSDocumentDirectory 或文档文件夹(或 tmp 文件夹) 1. 仅存在于运行时? 2. 仅定位在我必须部署的设备中。所以我不能在开发期间添加plist?或 3. 它是一个读写文件夹,但支持文件夹不是,所以我将它复制到那里?还是有其他原因??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多