如何使用自定义数据模型将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)的对象在此处输入代码

所以我有点不耐烦,因为我不知道我在这里做错了什么。如果有人能帮我指明正确的方向,那就太好了。再次感谢!

因此,传递自定义类可能会很痛苦。尽管所有的代码看起来都是正确的,但我仍然会收到错误。所以我退后一步,看着我的自定义对象,问自己"我真正需要的是什么?"通过这个过程,我决定只需要某些值,所以我只加密了这些值,而不是对象。由于这些值是int和字符串,因此iOS中内置了它们的编码和解码方法。从那时起,由于@mada的回答和我的想法,我能够传递这些价值观。

最新更新