Сохранение NSMutableArray в NSUserDefaults с использованием NSKeyedArchiver - PullRequest
3 голосов
/ 17 октября 2010

У меня проблемы с получением сохраненного NSMutableArray, содержащего пользовательский объект.Приложение вылетает и консоль сообщает http://pastie.org/1226822. Вот мой объект .h файл http://pastie.org/1226823. Вот мой объект .m файл http://pastie.org/1226826. Вот как я сохраняю свои данные http://pastie.org/1226830. Вот как я получаю свои данные http://pastie.org/1226831. Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 17 октября 2010

Fixed. Я использовал код Брэда Ларсона в Хранение пользовательских объектов в NSMutableArray в NSUserDefaults . Я думаю, что была проблема с тем, как я добавил данные обратно в мой массив, но теперь это работает.

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)
{
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
            objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
    else
            objectArray = [[NSMutableArray alloc] init];
}
1 голос
/ 17 октября 2010

Проблема не в NSMutableArray или в том, как вы вызываете NSKeyedArchiver. Проблема в том, что объекты внутри массива сами по себе не архивируются.

Вам нужны ваши объекты для реализации протокола NSCoding. Существует множество документации о том, как это сделать, но в основном вы просто добавляете метод initWithCoder: для создания объекта из архива и метод encodeWithCoder: для записи объекта в архив. Кусок торта!

1 голос
/ 17 октября 2010

Консоль расскажет вам обо всей проблеме. Ваш Assignment объект не реализует метод initWithCoder:

'NSInvalidArgumentException', reason: '-[Assignment initWithCoder:]: unrecognized selector sent to instance 0x5f04090'

KeyArchiver вызовет ваш класс, чтобы инициировать новый объект на основе данных декодирования. Вы должны использовать [decoder objectForKey:YOUR_KEY];

...