Sprite kit 使用NSCoding保存SKShapeNode的子类

Sprite kit 使用NSCoding保存SKShapeNode的子类,sprite-kit,nskeyedarchiver,nscoding,Sprite Kit,Nskeyedarchiver,Nscoding,我有一个子类SKShapenode,它有两个额外的属性 @property(assign)float size; @property(assign)float weight; 但是,当我保存一个NSMutableArray,其中包含节点的一些子类的核心数据时,有关大小和重量的信息就会丢失 newLevel.tractorObjects = [NSKeyedArchiver archivedDataWithRootObject:arrayTractorObjects]; 如何解决此问题?由于您

我有一个子类
SKShapenode
,它有两个额外的属性

@property(assign)float size;
@property(assign)float weight;
但是,当我保存一个
NSMutableArray
,其中包含节点的一些子类的核心数据时,有关大小和重量的信息就会丢失

newLevel.tractorObjects = [NSKeyedArchiver archivedDataWithRootObject:arrayTractorObjects];

如何解决此问题?

由于您似乎正在使用
NSCoding
对节点进行编码,因此需要在子类中实现
NSCoding
。现在,
SKShapeNode
正在进行所有编码,但它不知道您的子类属性。要对属性进行编码,需要实现
encodeWithCoder
initWithCoder
。这两者都应该调用
super
的实现,这样
SKShapeNode
就可以自己编码,然后添加/提取自己的属性。

当我这样做时:-(id)initWithCoder:(NSCoder*)解码器{if(self=[super init]){self.weight=[decoder decodeFloatForKey:@“weight”];self.size=[decoder decodeFloatForKey:@“size”];}返回self;}-(void)encodeWithCoder:(NSCoder*)编码器{[super-encodeWithCoder:encoder];[encoder-encodeFloat:self.weight-forKey:@“weight”];[encoder-encodeFloat:self.size-forKey:@“size”];}关于position+rect+节点的其他信息丢失了。我说这两个都需要调用super的实现,这不是开玩笑。你能提供一两行额外的代码来说明子类应该如何调用super吗?它只是
super.encode(with:aCoder);super.init(coder:aDecoder)
然后是所有子类属性?这就是所需的全部内容。