Как правильно передать NSMutableArray в NSUserDefaults с пользовательской моделью данных?
Позвольте мне предвосхитить, что мой код был специально скрыт. Я знаю, что имя не будет хорошим. Я пытаюсь добавить виджет в свое приложение с новой функциональностью iOS 8. Я использую эту ссылку в качестве учебника
Теперь, пока у меня есть это в моем ViewController, когда моя кнопка отправки вызывается в моем приложении. К этому времени все мои данные в этом массиве будут переданы.
//Passes the array of times to the shared group to be called by the notification center widget.
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.myGroup.TodayExtensionSharingDefaults"];
NSData *encodedArray = [NSKeyedArchiver archivedDataWithRootObject:tableViewController.TimeArray];
[sharedDefaults setObject:encodedArray forKey:@"TimesArray"];
[sharedDefaults synchronize];
Однако в моем массиве хранится пользовательская модель данных, которую я создал, поэтому в моей модели данных есть:
- (void)encodeWithCoder:(NSCoder *)encoder {
//Encode properties, other class variables, etc
[encoder encodeInt:_stopNumber forKey:@"stopNumber"];
[encoder encodeObject:_route forKey:@"route"];
[encoder encodeObject:_number forKey:@"number"];
[encoder encodeInt:_time forKey:@"time"];
[encoder encodeObject:_minutesOrApproaching forKey:@"@minutesOrApproaching"];
[encoder encodeObject:_noPrediction forKey:@"noPrediction"];
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if(self) {
//decode properties, other class vars
_stopNumber = [decoder decodeIntForKey:@"stopNumber"];
_route = [decoder decodeObjectForKey:@"route"];
_number = [decoder decodeObjectForKey:@"number"];
_time = [decoder decodeIntForKey:@"time"];
_minutesOrApproaching = [decoder decodeObjectForKey:@"minutesOrApproaching"];
_noPrediction = [decoder decodeObjectForKey:@"noPrediction"];
}
return self;
}
И тогда в моем виджете у меня есть этот код, который называется:
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.myGroup.TodayExtensionSharingDefaults"];
NSData *myDecodedObject = [defaults objectForKey: @"TimesArray"];
NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject];
int i = 0;
for (ETA *eta in decodedArray) {
if(i == 0){
_stopNumber.text = eta.number;
}
UILabel *label = [timeSlots objectAtIndex:i];
label.text = eta.minutesOrApproaching;
i++;
}
Моя проблема в том, что я продолжаю получать:
* Завершение работы приложения из-за необработанного исключения "NSInvalidUnarchiveOperationException", причина: '* - [NSKeyedUnarchiver decodeObjectForKey:]: невозможно декодировать объект класса (ETA) ", введите код здесь
Так что я немного расстроен, потому что я не знаю, что я делаю здесь неправильно. Было бы здорово, если бы кто-то помог мне направить меня в правильном направлении. Еще раз спасибо!
1 ответ
Таким образом, прохождение пользовательских классов может быть болезненным. И хотя весь код кажется правильным, я все еще получаю сообщение об ошибке. Поэтому я отступил, посмотрел на свой предмет и спросил себя: "Что мне действительно нужно от этого?" и, используя этот процесс, решил, что мне нужны только определенные значения, поэтому я зашифровал только эти значения, а не объект. Поскольку эти значения были целыми числами и строками, они встроены в iOS для того, как кодировать и декодировать. Оттуда я смог передать значения благодаря ответу @ meda и моей идее.