让我先说一句,我的代码被故意模糊了一点。我知道这个名字不太好。我正在尝试为我的应用程序添加一个具有新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)的对象在此处输入代码
所以我有点不耐烦,因为我不知道我在这里做错了什么。如果有人能帮我指明正确的方向,那就太好了。再次感谢!
因此,传递自定义类可能会很痛苦。尽管所有的代码看起来都是正确的,但我仍然会收到错误。所以我退后一步,看着我的自定义对象,问自己"我真正需要的是什么?"通过这个过程,我决定只需要某些值,所以我只加密了这些值,而不是对象。由于这些值是int和字符串,因此iOS中内置了它们的编码和解码方法。从那时起,由于@mada的回答和我的想法,我能够传递这些价值观。