NSKeyedArchiver为UIView的子视图返回nil

我有一个ViewController,在这里我添加了一个名为DrawingView的自定义UIView。 我想在这个DrawingView中添加dynamic数量的UITextView,所以我将UITextView与类名称分开为CustomTextView。 在ViewController中,我有以下代码将TextView添加到DrawingView。

- (void)viewDidLoad { [super viewDidLoad]; DrawingView * newDrawingView = [[DrawingView alloc]init]; self.drawingView = newDrawingView ; } -(void)setDrawingView:(DrawingView *)_drawingView { if (drawingView != _drawingView) { [drawingView removeFromSuperview]; drawingView = _drawingView; drawingView.customDelegate = self; drawingView.frame = scrollView.bounds; drawingView.layer.cornerRadius = 8; drawingView.backgroundColor = [UIColor whiteColor]; drawingView.clipsToBounds = YES; [self.view addSubview:drawingView]; } } 

在button操作上,我在图纸视图中添加了CustomTextView。

 currentText = [[TextViewContainer alloc]init]; [drawingView currentText]; 

现在我想将这个DrawingView和它的子视图,即CustomTextView一起归档。 所以在CustomTextView中,我添加了NSCoding协议并在其中添加了属性

 - (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { self.layer.borderWidth = [aDecoder decodeFloatForKey: @"borderWidth"] ; } } - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeFloat:self.layer.borderWidth forKey:@"borderWidth"]; } 

上述方法中还有其他自定义属性。 为了存档,我正在使用以下方法。

 - (NSData *)dataForView:(UIView *)view:(NSString *)fileName { NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:view forKey:fileName]; [archiver finishEncoding]; return (id)data; } -(void)saveChangesInFile :(NSString *)fileName { NSData *data = [self dataForView:drawingView:fileName]; NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *dataPath = [docsDirectory stringByAppendingPathComponent:@"/.hidden"]; if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) { [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil]; } NSString *pathes = [dataPath stringByAppendingPathComponent:fileName]; [data writeToFile:pathes atomically:YES]; } - (UIView *)viewForData:(NSData *)data:(NSString*)key { NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; UIView *view = [unarchiver decodeObjectForKey:key]; [unarchiver finishDecoding]; return view; } -(void)openSavedFileWithName:(NSString*)fileName{ NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *dataPath = [docsDirectory stringByAppendingPathComponent:@"/.hidden"]; NSString *filepath = [dataPath stringByAppendingFormat:@"/%@",fileName]; NSData *data = [NSData dataWithContentsOfFile:filepath]; if (data) { UIView *newDrawView = [self viewForData:data:fileName]; } NSLog(@"neew :%@",newDrawView.subviews); self.drawingView = (DrawingView *)newDrawView ; NSLog(@"self.drawingView :%@",self.drawingView.subviews); } 

但是我得到的子视图数组为零。 有人可以帮我吗?

认为你正试图归档一个视图本身。

 [archiver encodeObject:view forKey:fileName]; 

我认为是错的。 您不能存档任何UI组件,但只能存档模型。 例如,您可以将模型(包括特定视图的大小,颜色和背景图像)保存到数据库,并且不能将视图本身保存到数据库。 同样为了归档,你需要归档其数据(即数组,图像等),而不是UI组件本身。

查看NSKeyedArchiver的ClassReference了解更多细节。 另外,请看链接的详细解释。 谢谢。