1

我有一个简单的 iphone 应用程序,它使用 CALayer 的子类绘制块,并试图找到保存状态或保留当前创建的图层的最佳方法。

我尝试使用Brad Larson 在上一个问题中关于在 NSUserDefaults 中存储自定义对象的答案,这有助于保持我的 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)主要基于模型-视图-控制器组织。CALayers 在视图层中。这导致两个问题:

  1. 你的层向用户展示了你模型的哪一部分?
  2. 你如何使模型的那部分持续存在?

这些问题的答案就是你的解决方案。

如今,对于一个新的应用程序,最简单(当然是最可扩展)的持久模型路径可能是 Core Data。

于 2009-07-22T02:37:39.367 回答