1

ViewController が 1 つあります。この中に、DrawingView という名前のカスタム UIView を 1 つ追加しました。この DrawingView に動的な数の UITextView を追加したいので、クラス名を CustomTextView として UITextView をサブクラス化しました。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];
    }
}

ボタン操作で、描画ビューに 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);
}

しかし、サブビュー配列を nil として取得しています。誰でも私を助けてください。

4

1 に答える 1

2

ビュー自体をアーカイブしようとしていると考えてください。

[archiver encodeObject:view forKey:fileName];

私はそれが間違っていると思います。UI コンポーネントをアーカイブすることはできませんが、モデルのみをアーカイブできます。たとえば、モデル (特定のビューのサイズ、色、および背景イメージを含む) をデータベースに保存できますが、ビュー自体をデータベースに保存することはできません。同様に、アーカイブの場合、UI コンポーネント自体ではなく、そのデータ (viz、配列、画像など) をアーカイブする必要があります。

詳細については、NSKeyedArchiver ClassReferenceを参照してください。また、詳しい説明はリンク先をご覧ください。ありがとう。

于 2012-06-19T06:34:34.933 に答える