我有一个简单的iphone应用程序,它使用CALayer的子类绘制块,并且我正在尝试找到保存状态或保留当前创建的图层的最佳方法。
我尝试使用Brad Larson's answer from this previous question在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];
and -restoreStateWithData:
NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (savedLayers != nil) {
for(layer in savedLayers) {
[self.view.layer addSublayer:layer];
}
[spaceView.layer layoutSublayers];
}
答案 0 :(得分:5)
准确地说,根据Apple docs,CALayer实际上是模型,而不是MVC模式中的视图。
“CALayer是图层树对象的模型类。它封装了图层的位置,大小和变换,定义了它的坐标系。”
图层后面的视图实际上是图案的视图部分。如果没有后备视图,则无法显示图层。
在我看来,应该是完全合法的数据序列化候选者。看一下CALVer的KVC Extensions。特别注意:
- (BOOL)shouldArchiveValueForKey:(NSString *)key
答案 1 :(得分:3)
Cocoa(和Cocoa Touch)主要基于模型 - 视图 - 控制器组织。 CALayers在视图层中。这导致两个问题:
这些问题的答案是您的解决方案。
如今,对于一个新的应用程序,持久模型的最简单(当然是最可扩展的)路径可能是核心数据。