CALayerのサブクラスを使用してブロックをペイントする単純なiphoneアプリケーションがあり、状態を保存するか、現在作成されているレイヤーを永続化するための最良の方法を見つけようとしています。
NSUserDefaultsにカスタムオブジェクトを格納する際のこの前の質問からのBradLarsonの回答を使用してみました。これは、CALayerのサブクラスを永続化するために機能しましたが、ジオメトリや背景色などの基本的な状態ではなかったため、そこにありましたが、再起動時にレンダリングされませんでした。
宣言したインスタンス変数をNSCodingプロトコルに準拠させましたが、すべてのプロパティを再宣言せずにCALayerのプロパティを同じようにする方法がわかりません。それとも、これは完全に正しい/最良のアプローチではありませんか?
レイヤーの配列をアーカイブするために使用しているコードは次のとおりです。
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:viewController.view.layer.sublayers] forKey:@"savedArray"];
そして、これが-viewDidLoadでレイヤーをリロードするために使用しているコードです:
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil) {
[self restoreStateWithData:dataRepresentingSavedArray];
そして-restoreStateWithDataで:
NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (savedLayers != nil) {
for(layer in savedLayers) {
[self.view.layer addSublayer:layer];
}
[spaceView.layer layoutSublayers];
}