【问题标题】:Save subclass of SKShapeNode using NSCoding使用 NSCoding 保存 SKShapeNode 的子类
【发布时间】:2014-04-15 17:53:28
【问题描述】:

我有一个带有 2 个额外属性的 SKShapenode 子类

@property(assign)float size;
@property(assign)float weight;

但是当我保存带有核心数据的NSMutableArray 时,包含我节点的一些子类,有关大小+重量的信息丢失了。

newLevel.tractorObjects = [NSKeyedArchiver archivedDataWithRootObject:arrayTractorObjects];

我该如何解决这个问题?

【问题讨论】:

    标签: sprite-kit nskeyedarchiver nscoding


    【解决方案1】:

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

    【讨论】:

    • 当我这样做时: - (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { self.weight = [decoder decodeFloatForKey:@"weight"]; self.size = [解码器 decodeFloatForKey:@"size"]; } 返回自我; } - (void)encodeWithCoder:(NSCoder *)encoder { [super encodeWithCoder:encoder]; [编码器 encodeFloat:self.weight forKey:@"weight"]; [编码器 encodeFloat:self.size forKey:@"size"]; } position+rect+其他Node信息丢失。
    • 我不是在开玩笑,我说 both 都需要调用 super 的实现。
    • 您能否提供一两行额外的代码来说明子类应该如何调用 supers ?只是super.encode(with: aCoder); super.init(coder: aDecoder),然后是所有子类属性吗?
    • 这应该就是所有需要的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多