将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的

Posted

技术标签:

【中文标题】将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的【英文标题】:Save strings from different viewController to plist without overwriting old ones 【发布时间】:2014-08-08 22:44:45 【问题描述】:

我想将一些来自不同 ViewController 的字符串保存到一个 plist。 目前,我的 VC1 的 viewDidLoad 将字符串保存到 plist,当我调用 VC2 时,我的 plist 已被 VC2 中的字符串覆盖。

我在 VC1 和 VC2 中的 viewDidLoad 是相等的,像这样:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";


NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];


NSArray *array = [NSArray arrayWithObjects:dateString , nil ];


NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFolder = [path objectAtIndex:0];
NSString *filePath = [documentFolder stringByAppendingFormat:@"list.plist"];

//save to array
[array writeToFile:filePath atomically:YES];
NSLog(@"file Stored at %@",filePath);

问题:

    我该如何处理这个问题,我的 plist 中的指针会转到第二个位置,这样我就不会覆盖我的旧数据?

    我只想保存来自三个不同 ViewController 的字符串(日期和一些文本),这是一个很好的方法,还是我应该使用核心数据?

【问题讨论】:

保存一个 plist 是全部或全部。您需要将要保留的值加载到数组中,将新值添加到数组中。然后编写数组以使用您想要的值创建一个新的 plist。 @rmaddy:谢谢。我知道问题出在静态数组上,但我想也许有一些特别的东西可以处理这个问题。 【参考方案1】:

我建议你使用核心数据,它真的很简单,可以避免你编写代码来管理保存、日期和奇怪的逻辑。它还为您提供有用的功能,例如:

托管对象更改或保存以允许您更新 UI 时的通知 内置类 (NSFetchedResultController) 可帮助您在 tableViews 上高效显示数据

为避免与核心数据相关的样板代码,请尝试查看magicalrecord

【讨论】:

【参考方案2】:

解决第一个问题的两种方法:

    与其创建每次都覆盖的数组的本地版本,不如使用静态和全局且对两个控制器可见的 NSArray,这样每个控制器都附加到同一个对象,因此他们不会踩到对方的脚趾头。

    而不是写入文件 .. 附加到文件。

    NSString *contents = [NSString stringWithContentsOfFile:filepath];
    contents = [contents stringByAppendingString:textToWrite];
    [contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err];
    

回答您的第二个问题.. 我想说这取决于数据交互的种类和数量.. 如果数据很小并且交互又远又少,那么文件存储就可以了。

如果数据量很大并且交互开始变得更加复杂和复杂.. 有多个类读写,CoreData 绝对是一个值得关注的选项。

我的 2 美分价值

【讨论】:

以上是关于将来自不同视图控制器的字符串保存到 plist 而不覆盖旧的的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串保存到Core Data Swift

如何将自定义数组保存/重新加载到 plist

来自 Plist 的 UIImageView

将字符串保存到属性列表(plist)文件?

在 plist iPhone 中保存事件及其发生的时间

如何将图像保存到具有来自先前视图控制器的 id 的单独相册中