1

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];      
}
4

2 に答える 2

5

正確には、Appleのドキュメントによると、CALayerは実際にはモデルであり、MVCパターンのビューではありません。

「CALayerはレイヤーツリーオブジェクトのモデルクラスです。レイヤーの位置、サイズ、変換をカプセル化し、座標系を定義します。」

レイヤーの背後にあるビューは、実際にはパターンのビュー部分です。レイヤーは、バッキングビューなしでは表示できません。

それはデータシリアル化の完全に正当な候補であるはずだと私には思えます。CALayerのKVC拡張機能をご覧ください。特に見てください:

- (BOOL)shouldArchiveValueForKey:(NSString *)key
于 2009-07-26T05:23:01.860 に答える
3

Cocoa(およびCocoa Touch)は、ほとんどがmodel-view-controller組織に基づいています。CALayersはビュー層にあります。これは2つの質問につながります:

  1. モデルのどの部分がユーザーに表示されますか?
  2. モデルのその部分をどのように持続させますか?

それらの質問への答えはあなたの解決策です。

現在、新しいアプリの場合、永続モデルへの最も単純な(確かに最も拡張可能な)パスはおそらくCoreDataです。

于 2009-07-22T02:37:39.367 に答える