Сохранение одного NSMutableDictionary в списке - PullRequest
1 голос
/ 11 марта 2010

У меня есть один словарь, который мне нужно сохранить в листе. PaletteDictionary всегда возвращает nil:

- (void)saveUserPalette:(id) sender
{
    [paletteDictionary setObject:matchedPaletteColor1Array forKey:@"1"];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"UserPaletteData.plist"];
    // write plist to disk
    [paletteDictionary writeToFile:path atomically:YES];    
}

Я читаю данные обратно в другом виде, например:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"UserPaletteData.plist"];

NSMutableDictionary *plistDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:path];
if(plistDictionary==nil ){
    NSLog(@"failed to retrieve dictionary from disk");
}

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Можете ли вы упомянуть, что является объектом "matchedPaletteColor1Array". Я полагаю, это какой-то особый объект класса. Насколько мне известно, объекты для записи должны соответствовать NSCoding, что NSString, NSDate и т. Д. Уже есть, поэтому в данном коде установка "matchedPaletteColor1Array" как некоторой строки будет работать.

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

1 голос
/ 11 марта 2010

Запустите ваше приложение в симуляторе и перейдите по следующему пути:

~ / Библиотека / Поддержка приложений / iPhone Simulator / Пользователь / Приложения / {GUID} / Документы

Где GUID будет такой строкой: 06430A38-AFAC-4C68-8F39-DBD6C81A5AA6 (это, вероятно, последняя измененная папка).

Убедитесь, что UserPaletteData.plist присутствует, и загрузите его в Редактор списка свойств .app , чтобы убедиться, что он содержит некоторые данные.

Также убедитесь, что вы используете только следующие типы данных в своем словаре, иначе он не сможет записать в список: (NSData, NSDate, NSNumber, NSString, NSArray или NSDictionary).

Чтобы убедиться, что словарь, который вы пытаетесь сохранить на диск, действителен для plist, попробуйте следующее:

for (id key in paletteDictionary) 
{
    NSLog(@"key: %@, value: %@, class: %@", key, [paletteDictionary objectForKey:key], NSStringFromClass([[paletteDictionary objectForKey:key] class]));
}

Это должно сказать вам, если какой-либо из ваших объектов имеет неправильный тип данных для plist.

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

0 голосов
/ 11 марта 2010

Убедитесь, что вы выделяете (alloc / init) paletteDictionary перед его использованием.

...