2

<NSCoding>概要:親クラスからカスタム クラスを派生させるencodeWithCoderと、アプリケーションの状態の保存中にメソッドが呼び出されます。親を に変更するSKNodeと、encodeWithCoderメソッドは呼び出されなくなります。

詳細:

UIKitビュー コントローラーは、アプリケーションの状態の保存中にエンコードされます。タイプ の単一のオブジェクトをエンコードしますMyNode

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
  [super encodeRestorableStateWithCoder:coder];

  MyNode *myNode = [[MyNode alloc] init];
  NSLog(@"view controller encoding");
  [coder encodeObject:myNode forKey:@"myNode"];
}

MyNodeこの質問のために構築された簡素化されたクラスです。完全を期すためにコードを含めますが、encode メソッドと decode メソッドは単にNSLogandを呼び出しますsuper

@interface MyParent : NSObject <NSCoding>
@end

@interface MyNode : MyParent
@end
@implementation MyParent

- (id)initWithCoder:(NSCoder *)aDecoder
{
  NSLog(@"MyParent decoding");
  self = [super init];
  return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
  NSLog(@"MyParent encoding");
}

@end

@implementation MyNode

- (id)initWithCoder:(NSCoder *)aDecoder
{
  NSLog(@"MyNode decoding");
  self = [super initWithCoder:aDecoder];
  return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
  NSLog(@"MyNode encoding");
  [super encodeWithCoder:aCoder];
}

@end

上記のようにの親が の場合、MyNodeアプリケーションMyParentの保存中にログに記録された出力が表示されます。

2014-05-12 15:22:33.342 Flippy[35091:60b] saving application state
2014-05-12 15:22:33.342 Flippy[35091:60b] view controller encoding
2014-05-12 15:22:33.343 Flippy[35091:60b] MyNode encoding
2014-05-12 15:22:33.343 Flippy[35091:60b] MyParent encoding

しかし、の親を に変更するとMyNodeSKNode実装encodeWithCoderは呼び出されません。

2014-05-12 15:22:57.847 Flippy[35115:60b] saving application state
2014-05-12 15:22:57.848 Flippy[35115:60b] view controller encoding

なぜだめですか?

私が試したこと:

  • 独自の を使用してカスタム クラスをアーカイブしNSKeyedArchiverます。これは期待どおりに機能します。
  • カスタム クラスにプロトコルを実装UIStateRestoringし、復元識別子を使用してアプリケーションに登録します。これは私にはあまり意味がありませんでした。
  • この質問classForCoderのように、いじります。しかし、それが当てはまるようには聞こえず、とにかくカスタムクラスで呼び出されていません。classForCoder

(このテスト ケースに影響を与えた現実世界の問題の詳細は関係ないようです。)

4

0 に答える 0