writeToFile Выходные данные .plist не записывают правильные значения - PullRequest
0 голосов
/ 21 июня 2010

Я пытался написать простую программу списка покупок, но когда я пытаюсь записать измененные значения обратно в файл plist, я получаю только те исходные значения, которые были в файле для начала.

Мой исходный файл plist представляет собой один большой массив (dataArray) словарей, содержащий только два поля в каждом словаре, один bool и одну строку, когда вы выбираете элемент в табличном представлении, значение bool изменяется для отдельного элемента, и когда я вывожу В консоли dataArray я вижу, что значение было изменено, моя единственная проблема в том, что когда я пытаюсь записать dataArray в файл, я получаю файл в каталоге документов, но все значения bool по-прежнему отключены.

- (void)viewDidLoad {

 //load from plist file
 NSString *path = [[NSBundle mainBundle] pathForResource:@"OriginalChecklist" ofType:@"plist"];
 self.dataArray = [NSMutableArray arrayWithContentsOfFile:path];

    [super viewDidLoad];
}

- (void)viewWillDisappear:(BOOL)animated 
{
 NSString *documentsDirectory = [@"~/Documents/" stringByExpandingTildeInPath];
 NSString *savePath = [documentsDirectory stringByAppendingPathComponent:@"Checklist.plist"];
 [dataArray writeToFile:savePath atomically:YES];

 NSLog(@"location information %@", savePath); 
 NSLog(@"dataAray contents %@=", dataArray);
}

И, как я уже сказал, выводя результат dataArray на консоль, я получаю следующие результаты из проверенных элементов.

cell = <UITableViewCell: 0x3b143d0; frame = (0 0; 320 44); text = 'Water Bottle'; autoresize = W; layer = <CALayer: 0x3b14650>>;
checked = 1;
text = "Water Bottle";

cell = <UITableViewCell: 0x3b20560; frame = (0 88; 320 44); text = 'GPS'; autoresize = W; layer = <CALayer: 0x3b20610>>;
checked = 1;
text = GPS;

Если кто-нибудь знает, как сохранить измененные результаты в файл plist, я был бы очень признателен за небольшую помощь.

Спасибо Бред


У меня все еще есть небольшие проблемы с тем, что мое приложение может создать список и загрузить информацию из этого списка в раздел ViewDidLoad. Код, который я сейчас использую для проверки исходного файла, и если его нет, создайте его следующим образом

(void) viewDidLoad {

BOOL success;

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"CustomChecklist.plist"];

success = [fileManager fileExistsAtPath:filePath];
NSLog(@"STATUS OF SUCCESS %@",success);
if (!success) {
    NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@"OriginalChecklist.plist"];
    success = [fileManager copyItemAtPath:path toPath:filePath];
    self.dataArray = [NSMutableArray arrayWithContentsOfFile:filePath];
    NSLog(@"IF STATEMENT CREATING THE FILE");
}else {
    self.dataArray = [NSMutableArray arrayWithContentsOfFile:filePath];
    NSLog(@"IF STATEMENT READING THE FILE");
}

NSLog(@"location information %@", filePath);
[super viewDidLoad];

}

Когда я создаю это приложение, оно собирается и работает нормально, но я получаю пару предупреждений NSFileManager может не отвечать на -copyItemAtPath: toPath

После этого вывод на консоль выглядит так, как будто он даже не проверил файл или не создал файл для чтения.

2010-07-06 16: 22: 42.803 CampingChecklist [400: 207] СОСТОЯНИЕ УСПЕХА (пусто) 2010-07-06 16: 22: 42.805 CampingChecklist [400: 207] ЕСЛИ ЗАЯВЛЕНИЕ ЧИТАЕТ ФАЙЛ 2010-07-06 16: 22: 42.814 CampingChecklist [400: 207] информация о местоположении / Пользователи / Брэд / Библиотека / Поддержка приложений / iPhone Simulator / 3.1.3 / Приложения / E7074D5A-3E7A-4D2E-9F92-82B1A04873F8 / Documents / CustomChecklist .plist

И, очевидно, поскольку в файле ничего нет, когда он пытается сэкономить при выходе из приложения, он не создает никакого файла по указанному пути.

Если кто-нибудь сможет пролить свет на эту проблему, я был бы очень признателен.

Спасибо Брэд

1 Ответ

3 голосов
/ 21 июня 2010

Когда вы загружаете свой plist в первый раз, он поступает из пакета приложений, который недоступен для записи.

Когда вы сохраняете свои данные, вы правильно сохраняете их в каталоге документов.

Однако, когда вы в следующий раз снова загрузите свой plist, вы снова загружаете его из пакета Appele, который не был изменен.

Вам необходимо добавить некоторую логику в код загрузки plistкоторый проверяет наличие файла в каталоге документов.Если он существует, загрузите его, если не загрузите один из комплекта приложения.

...