Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么在应用程序状态保存期间,encodeWithCoder没有在SKNode的子类上被调用?_Ios_Sprite Kit_Nscoding_Skspritenode_State Restoration - Fatal编程技术网

Ios 为什么在应用程序状态保存期间,encodeWithCoder没有在SKNode的子类上被调用?

Ios 为什么在应用程序状态保存期间,encodeWithCoder没有在SKNode的子类上被调用?,ios,sprite-kit,nscoding,skspritenode,state-restoration,Ios,Sprite Kit,Nscoding,Skspritenode,State Restoration,摘要:当我从父级派生自定义类时,我会看到在应用程序状态保存期间调用的encodeWithCoder方法。如果我将父级更改为SKNode,则不再调用我的encodeWithCoder方法 详情: 我的视图控制器在UIKit应用程序状态保存期间进行编码。它对类型为MyNode的单个对象进行编码 -(void)encodeRestorableStateWithCoder:(NSCoder*)编码器 { [super-encoder-restorablestatewithcoder:coder]; My

摘要:当我从父级
派生自定义类时,我会看到在应用程序状态保存期间调用的
encodeWithCoder
方法。如果我将父级更改为
SKNode
,则不再调用我的
encodeWithCoder
方法

详情:

我的视图控制器在
UIKit
应用程序状态保存期间进行编码。它对类型为
MyNode
的单个对象进行编码

-(void)encodeRestorableStateWithCoder:(NSCoder*)编码器
{
[super-encoder-restorablestatewithcoder:coder];
MyNode*MyNode=[[MyNode alloc]init];
NSLog(@“视图控制器编码”);
[编码器编码对象:myNode forKey:@“myNode”];
}
MyNode
是为这个问题构建的精简类。为了完整性,我将包括代码,但是编码和解码方法只调用
NSLog
super

@接口MyParent:NSObject
@结束
@接口MyNode:MyParent
@结束
@实现MyParent
-(id)initWithCoder:(NSCoder*)aDecoder
{
NSLog(@“MyParent解码”);
self=[super init];
回归自我;
}
-(void)编码器与编码器:(NSCoder*)一个编码器
{
NSLog(@“MyParent编码”);
}
@结束
@实现MyNode
-(id)initWithCoder:(NSCoder*)aDecoder
{
NSLog(@“MyNode解码”);
self=[super initWithCoder:aDecoder];
回归自我;
}
-(void)编码器与编码器:(NSCoder*)一个编码器
{
NSLog(@“MyNode编码”);
[超级编码器与编码器:aCoder];
}
@结束
如上所述,当
MyNode
的父节点是
MyParent
时,我会在应用程序保存期间看到记录的输出:

2014-05-12 15:22:33.342 Flippy[35091:60b]正在保存应用程序状态
2014-05-12 15:22:33.342 Flippy[35091:60b]视图控制器编码
2014-05-12 15:22:33.343 Flippy[35091:60b]MyNode编码
2014-05-12 15:22:33.343 Flippy[35091:60b]我的父母编码
但是,当我将
MyNode
的父节点更改为
SKNode
时,我的
encodeWithCoder
实现不会被调用:

2014-05-12 15:22:57.847 Flippy[35115:60b]保存应用程序状态
2014-05-12 15:22:57.848 Flippy[35115:60b]视图控制器编码
为什么不呢

我尝试过的事情:

  • 使用我自己的
    NSKeyedArchiver
    存档我的自定义类。这正如预期的那样有效
  • 在我的自定义类上实现
    UIStateRestoring
    协议,并使用还原标识符向应用程序注册它。这对我来说没什么意义
  • classForCoder
    混在一起,如中。但是它听起来并不适用,而且我的自定义类上也没有调用
    classForCoder

(激发这个测试用例的真实问题的细节似乎不相关。)

我回答这个问题是因为
SKNode
没有实现
NSCoding
。卡尔(正确地)指出:“好主意,但是
SKNode
确实实现了
NSCoding
(参见
SKNode
类参考)。此外,消息处理的工作方式,即使
MyNode
没有声明它符合
,它仍然会尝试处理
encodeWithCoder
消息。”我删除了我的答案,因为人们可能会忽略这个问题,因为它已经有了答案。值得一提的是,我正在开发一个新的应用程序,遇到了同样的问题,这仍然让我感到困惑:在
NSKeyedArchiver encodeObject:forKey:
中发生了什么可以阻止调用对象的
encodeWithCoder:
方法,以及
SKNode
在做什么来阻止这样的事情?答案必须在源代码中。