2013-12-17 70 views
0

我有一个应用程序有几个ViewControllers。每个ViewController都有一个问题2-5 buttons作为可能的答案。一个按钮的标题被​​保存到名为submissionNSMutableArray。用户可以回到以前的问题,更改他们的答案,并且NSMutableArray会相应地更新。我需要将此数组保存到文件中,以便每次完成问卷时可以将新结果保存到UITableView中。我已经研究过,听起来像一个.plist是一个不错的选择,因为我的所有对象都在NSStrings将NSMutableArray的内容保存到文件

我的阵列的样品:

2013-12-17 14:06:34.210 Questionnaire[1724:70b] (
    1234, 
    "Dec 17, 2013", 
    Yes, 
    Games, 
    "Not Applicable", 
    Yes 
) 

“1234”是用户ID,日期是出生日期,和其他提交是答案的每个问题。

我ViewControllers是这样的:

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获得通过每个视图控制器通过。

我的问题:什么方法保存到文件将最适合我的需求? (.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]; 
+0

为了简单起见,您可以开始储存为plist。为此,查看[本指南](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html)。 – Jeremy

+0

我试图用Apple文档学习它,但我始终觉得它是以一种方式写的,假设读者是Objective-C中的优秀程序员。我一直在努力研究更多初学者友好的教程,你认为我可以在我的代码中实现这个吗? - https://gist.github.com/hollance/6328192 – rosshump

回答

1

你可以将你的数组保存为JSON文件。这将允许您在文本编辑器中查看它,而不是电子表格。下面的代码会将其写为JSON文件:

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
url = [url URLByAppendingPathComponent:@"yourdata.json"]; 
NSError *e = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:yourdata options:NSJSONWritingPrettyPrinted error:&e]; 

if (jsonData) { 
    [jsonData writeToFile:url.path atomically:YES]; 
} 

您还可以将数据保存为plist文件。以下将所述数据写入到的plist:

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
url = [url URLByAppendingPathComponent:@"yourdata.plist"]; 
NSError *e = nil; 
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:yourdata format:NSPropertyListXMLFormat_v1_0 options:0 error:&e]; 

if (plistData) { 
    [plistData writeToFile:url.path atomically:YES]; 
} 

的Plist可以保存在二进制或XML格式,并且上述将其保存为XML格式,这意味着该XML也将是可读的用文本编辑器。再一次,这不会以电子表格的形式显示。如果您想以CSV格式导出数据,则可能需要编写自己的代码才能输出。

+0

好的,我会尝试这两种方法,看看最适合哪种。我应该在Q4ViewController的viewDidLoad方法中实现这个代码?还是应该有自己的方法?对不起,但我真的很新的iOS编程,谢谢。 – rosshump

+0

你会把它放在任何合理保存信息的地方。我需要将整个代码视为一个整体来看看最合适的方式来调用它。但是,为了将这块代码放在自己的方法中,这很有意义,特别是如果你想传递数组或字典来编码方法,如果你想在你的代码中的不同位置调用它。 – Gavin

+0

太棒了,非常感谢!我能够将它保存到.plist中,没有问题。现在我要实现一个函数来给.plist发电子邮件。我现在唯一的问题是它显示的格式,即。项目0,项目1等。有什么方法可以改变这些值吗?谢谢你的帮助! – rosshump

0

您可以使用标准NSCoding协议来保存数据,但在这种情况下,你不能在Excel中读取它。 或者你可以将它保存在xml中。 或者您可以手动创建一个csv(逗号分隔值)文件并在任何地方打开它。 无论如何,你的实现取决于你:)