2014-09-25 23 views
-1

让我先说明我的代码有目的被掩盖了一点。我知道这个名字不会很好。我正在尝试使用新的iOS 8功能将小部件添加到我的应用程序中。我正在使用this link as a tutorial如何使用自定义数据模型将NSMutableArray正确传递给NSUserDefaults?

现在,到目前为止,当我的提交按钮在我的应用程序中被调用时,我在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

您可能不应该使用'NSUserDefaults'来存储应用程序数据。也许使用数据库或自定义数据文件格式。 – Droppy 2014-09-25 13:51:52

+0

这不是关于存储可变数组,它是关于[在NSUserDefaults中存储自定义对象](http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults?rq= 1)(或者在这种情况下是一组自定义对象),不是吗? – DarkDust 2014-09-25 13:53:46

+0

是的,但我不确定它是否与可变数组有关。另外,根据本教程,我在应用的功能部分中使用了AppData选项。 – David 2014-09-25 13:56:11

回答

1

所以,事实证明,通过自定义类可能是一个痛苦。虽然所有的代码似乎都是正确的,但我仍然遇到错误。于是我退后一步,看着我的自定义对象,并问自己:“我真的需要从中得到什么?”并使用该过程决定我只需要某些值,所以我只加密那些值而不是对象。由于这些值是整数和字符串,因此它们是如何编码和解码的。从那里,我能够传递价值,这要归功于@ meda的回答和我的想法。

+0

“加密”和“编码”之间有很大的区别,也许你的意思是“编码”。 – zaph 2014-09-25 18:02:30

相关问题