【发布时间】:2014-01-05 08:56:04
【问题描述】:
我有一个包含多个ViewControllers 的应用程序。每个ViewController 都有一个问题,其中有2-5 个buttons 作为可能的答案。按钮的标题保存到名为submission 的NSMutableArray。用户可以返回之前的问题,更改他们的答案,NSMutableArray 将相应更新。我需要将此数组保存到文件中,以便每次完成调查问卷时都可以将新结果保存到UITableView。我进行了研究,听起来 .plist 是一个不错的选择,因为我在数组中的所有对象都是 NSStrings。
我的数组样本:
2013-12-17 14:06:34.210 Questionnaire[1724:70b] (
1234,
"Dec 17, 2013",
Yes,
Games,
"Not Applicable",
Yes
)
“1234”是用户ID,日期是出生日期,其他提交的是每个问题的答案。
我的 ViewController 如下所示:
MainViewController
InfoViewController <-- Array allocated + initialised, inserting ID and DoB
Q1ViewController <-- question
..
Q4ViewController <--question
ENDViewController <-- offers user options for Home or Results
ResultsViewController <-- UITableView ordered by User ID
SavedResultsViewController <-- UITableView showing complete submission
NSMutableArray 通过每个 ViewController 传递。
我的问题:哪种保存到文件的方法最适合我的需要? (.plist、文件类型等)。在 Excel 上查看结果会很好(但不是必需的)。保存应该在哪里进行?我在想当最后一个对象被插入到 Q4 ViewController 的数组中时,所以当弹出 ENDViewController 时它将被保存到文件中,这是合乎逻辑的吗?我需要创建一个新的Objective-C 文件来存储数据吗?我看过一些解释这一点的教程,在单独的NSObject 文件中声明每个对象,尽管我不确定是否需要这样做,因为我的对象已经存储在数组中。
您可能已经猜到我对 Objective-C 和 iOS 编程很陌生,因此非常感谢您提供的任何帮助。我不知道如何描述我的问题,如果问题仍然不清楚,请道歉。
编辑:自从创建这篇文章以来,我对 Objective-C 有了更多的了解,并决定将我的数据保存到 .csv 文件中。此文件仅用于发送电子邮件,它不会显示在UITableView 上(我目前正在为此实施Core Data)。这个解决方案将来可能会对某人有所帮助,所以这里是:
// Set column titles for .csv
NSArray *columnTitleArray = @[@"User ID", @"DoB", @"Question 1", @"Question 2", @"Question 3", @"Question 4"];
NSString *columnTitle = [columnTitleArray componentsJoinedByString:@","];
NSString *columnTitleToWrite = [columnTitle stringByAppendingString:@"\n"];
// Separate submissions from array into cells
NSString *questionResults = [self.submission componentsJoinedByString:@","];
NSString *questionResultsToWrite = [questionResults stringByAppendingString:@"\n"];
// Find documents directory
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// Set file name and type
NSString *survey = [docPath stringByAppendingPathComponent:@"result.csv"];
// Create new file if none exists
if (![[NSFileManager defaultManager] fileExistsAtPath:survey]){
[[NSFileManager defaultManager] createFileAtPath:survey contents:nil attributes:nil];
// Set column titles for new file
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:survey];
[fileHandle writeData:[columnTitleToWrite dataUsingEncoding:NSUTF8StringEncoding]];
}
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:survey];
[fileHandle seekToEndOfFile];
[fileHandle writeData:[questionResultsToWrite dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
【问题讨论】:
-
为简单起见,您可以先保存到 plist。为此,请查看this guide。
-
我尝试通过 Apple 文档来学习它,但我总是发现它的编写方式假设读者是 Objective-C 中的优秀程序员。我一直在尝试研究更多对初学者友好的教程,你认为我可以在我的代码中实现它吗? - gist.github.com/hollance/6328192
标签: ios objective-c memory-management nsmutablearray plist