Позвольте мне предварить, что мой код был намеренно немного скрыт. Я знаю, что имя не будет хорошим. Я пытаюсь добавить виджет в свое приложение с новой функциональностью 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)", введите здесь код
Так что я немного сбит с толку, потому что я не знаю, что я делаю неправильно здесь. Было бы очень здорово, если бы кто-нибудь помог указать мне правильное направление. Спасибо еще раз!
NSUserDefaults
для хранения данных приложения. Возможно, используйте базу данных или пользовательский формат файла данных. - person Droppy   schedule 25.09.2014NSArray
. Я не вижу ничего очевидного, ваш код выглядит хорошо для меня. При поиске этого сообщения я заметил две распространенные проблемы: отсутствующие символы (забыл добавить фреймворк) или некоторые редкие проблемы со ссылками. Поэтому попробуйте очистить и создать с нуля (и удалить свое приложение с устройства) и убедитесь, что ваш виджет действительно включает (ссылка) ваш класс. - person DarkDust   schedule 25.09.2014_time
- это int ?? - person meda   schedule 25.09.2014eta.minutesOrApproaching
какNSLog(@"minutesOrApproaching =%@", eta.minutesOrApproaching);
- person meda   schedule 25.09.2014