无法在 iOS 中将数据写入 .plist

Posted

技术标签:

【中文标题】无法在 iOS 中将数据写入 .plist【英文标题】:can't write data to .plist in iOS 【发布时间】:2015-09-27 10:45:26 【问题描述】:

我正在尝试使用下一个方法将数据写入 .plist 文件:

-(IBAction)saveCity:(id)sender
    NSString * path = [[NSBundle mainBundle] pathForResource:@"propTest" ofType:@"plist"];
    NSMutableArray * array = [NSMutableArray arrayWithContentsOfFile:path];
    [ array addObject:@"addedTest"];
    if ([array writeToFile:path atomically:NO])
        NSLog(@"written");
    

我已经提前手动创建了 propTest.plist 和下一个内容:

调用 saveCity: 几次后,我可以看到从 propTest.plist 读取的数组包含我的字符串:

但实际上它只包含我手动添加的内容:

能否请您帮我找出新字符串未永久添加到 .plist 的原因?

【问题讨论】:

您不能写入包 - 这是一个只读包。应用启动后,您需要在文档目录中创建 plist 文件 【参考方案1】:

简单的答案是 - 不,你不能这样做ios 应用程序在沙盒环境中运行,您无法在运行时修改应用程序包,因此您无法在 [NSBundle mainBundle] 中写入任何内容。

您应该改用应用程序的文档目录。这就是你可以做到这一点的方法。在这里,为了您的知识,我正在从主包中复制数据,添加新的详细信息并写回文档目录。

// Get you plist from main bundle
NSString *path = [[NSBundle mainBundle] pathForResource:@"propTest" ofType:@"plist"];
NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:path];

// Add your object
[array addObject:@"addedTest"];

// Get Documents directory path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistLocation = [documentsDirectory stringByAppendingPathComponent:@"propTest.plist"];

// Write back to Documents directory
[array writeToFile:plistLocation atomically:YES];

【讨论】:

感谢您的回答! 虽然这是正确的方法,但您应该使用 URL 而不是基于字符串的文件路径。 @Abizern,为什么 URL 更好?这是一种常见的做法,还是使用 URL 背后有真正的好处? @YuraVasylenko 在此处developer.apple.com/library/ios/documentation/FileManagement/… 的文档中的“使用现代文件系统接口”标题下有一句话 - 当决定调用哪些例程时,选择那些允许您使用 NSURL 对象指定路径的对象,而不是那些使用字符串指定路径的对象。

以上是关于无法在 iOS 中将数据写入 .plist的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3:无法将数据写入 plist 文件

在运行应用程序时将数据写入 plist 并将它们读取到 UITable

蜗牛爱课- iOS中plist的创建,数据写入与读取

iOS学习笔记13-字典数据写入plist

如何成功写入plist?

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