2013-12-17 3 views
0

У меня есть приложение, которое содержит несколько ViewControllers. У каждого ViewController есть вопрос с 2-5 buttons в качестве возможных ответов. Название кнопки сохраняется на NSMutableArray под названием submission. Пользователь может вернуться к предыдущим вопросам, изменить их ответ, и соответственно обновится 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» является идентификатором пользователя, дата является дата рождения и другие материалы являются ответы на каждый вопрос.

Моего 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 получает проходит через каждую 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]; 
+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]; 
} 

Plists могут быть сохранены в двоичном или XML-формате, и выше, сохранить его в формате XML, что означает, что XML также будет читаться с помощью текстового редактора. Опять же, это не будет отображаться в виде таблицы. Если вы хотите экспортировать свои данные в формате CSV, вам, вероятно, придется написать свой собственный код для его вывода.

+0

Хорошо, я попробую оба этих метода и посмотрю, какие костюмы лучше всего подходят. Где я должен реализовать этот код, в методе viewDidLoad на Q4ViewController? Или у него есть собственный метод? Извините, но я действительно очень новичок в программировании на iOS, спасибо. – rosshump

+0

Вы бы поставили его везде, где было бы логично сохранить информацию. Мне нужно будет взглянуть на ваш код в целом, чтобы узнать, где будет наиболее разумно его назвать. Но для того, чтобы поместить этот кусок кода в свой собственный метод, это имеет смысл, особенно если вы хотите передать массив или словарь для кодирования в метод, если вы хотите вызвать его в разных местах вашего кода. – Gavin

+0

Это великолепно, спасибо большое! Я смог сохранить его в .plist без проблем. Теперь я собираюсь реализовать функцию отправки электронной почты .plist. Моя единственная проблема - это формат, который он отображает, т.е. пункт 0, пункт 1 и т. д. Есть ли способ изменить эти значения? Спасибо за вашу помощь! – rosshump

0

Вы можете использовать стандартный протокол NSCoding для сохранения данных, но в этом случае вы не можете прочитать его в Excel. Или вы можете сохранить его в xml. Или вы можете вручную создать файл csv (значения, разделенные запятыми) и открыть его в любом месте. Реализация до вас в любом случае :)

Смежные вопросы