1

我已经关注了其他一些线程,并成功地将自定义对象保存/加载到NSUserDefaults使用NSCoding协议中。但是,奇怪的是:我无法更新对象。

这是一些代码块(注意:XUtil objectForKey:并且setObject:forKey:只是从执行加载/保存NSUserDefaults

// First, load the object.
+ (id)loadCustomObject 
{
    NSData *encodedObject = [XUtil objectForKey:@"customObject"];
    return encodedObject ? [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject] : nil;
}

接下来,执行更新其属性,然后:

// Finally, re-encode and save.
- (void)saveToDefault
{
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self];
    [XUtil setObject:encodedObject forKey:@"customObject"];
}

所以经过几次尝试,我发现 KeyArchiver 有问题

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:(NSStringFromSelector(@selector(name))];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    self.name = [aDecoder decodeObjectforKey:(NSStringFromSelector(@selector(name))];
    return self;
}

首先,加载对象,罚款(name = @"ObjectName")。更新属性 ( self.name = @"New Name")。打电话[self saveToDefault]

我将调试archivedDataWithRootObject:self放在第二个块之后:

po [[NSKeyedUnarchiver unarchiveObjectWithData:encodeObject] name]
-> old values

所以 keyArchiver 不会更新属性,但我不确定下一步该做什么。

编辑5

一天后,尝试了各种可能的方法,我变得如此绝望,将整个NSCoder对象转换为NSDictionary并毫无困难地保存。无论如何,使用这个“将自定义对象保存到NSUserDefault”有什么意义......人们,请给我这个问题的启示。

4

0 回答 0