1

画像を描画する場所の座標データも含むUIImageクラスを作成しました。

#import "UIImageExtras.h"
#import <objc/runtime.h>

@implementation UIImage (Extras)

static char UII_ORIGINDATA_KEY;

@dynamic originData;

- (void)setOriginData:(NSValue *)originData {
    objc_setAssociatedObject(self, &UII_ORIGINDATA_KEY, originData, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSValue *)originData {
    return (NSValue *)objc_getAssociatedObject(self, &UII_ORIGINDATA_KEY);
}

これまでのところすべて良い。これらの画像の配列を含むクラスがあります。クラスはBookDocと呼ばれ、配列はillustrationsと呼ばれます。BookDocのインスタンスをコピーするときは、配列をコピーします。画像ごとに定義したoriginDataは正常にコピーされます。

ただし、この新しいコピーをファイルに保存すると、originDataが失われます。これは私の保存方法です:

- (void)saveIllustrations {
if (_illustrations == nil) {
    NSLog(@"Nil array");
    return;
}

[self createDataPath];
NSString *illustrationsArrayPath = [_docPath stringByAppendingPathComponent:kIllustrationsFile];
BOOL result = [NSKeyedArchiver archiveRootObject:_illustrations toFile:illustrationsArrayPath];
if (!result)
    NSLog(@"Failed to archive array");

//This is not saving the originData. 

self.illustrations = nil;

}

私の質問は、各画像のoriginDataが確実に保存されるようにするにはどうすればよいですか?どうもありがとう。

アップデート:

OK、UIImageExtraというクラスでUIImageをサブクラス化するように変更し、次のようにNSCodingに準拠させました。

    - (void)encodeWithCoder:(NSCoder *)aCoder {
    NSLog(@"Encoding origin data!");
    [aCoder encodeObject:originData forKey:kOriginData];
    [super encodeWithCoder:aCoder];
}

    - (id)initWithCoder:(NSCoder *)aDecoder {
        if (self = [super initWithCoder:(NSCoder *) aDecoder]) {
            NSLog(@"Decoding origin data");
            self.originData = [aDecoder decodeObjectForKey:kOriginData];
        }
        return self;
    }

これらのUIImageExtraインスタンスを含むillustrations配列を保存すると、元のデータが自動的に保存されるべきではありませんか?配列を保存するための私のコードは次のようになります。

- (void)saveIllustrations {
if (_illustrations == nil) {
    NSLog(@"Nil array");
    return;
}

[self createDataPath];
NSString *illustrationsArrayPath = [_docPath stringByAppendingPathComponent:kIllustrationsFile];
BOOL result = [NSKeyedArchiver archiveRootObject:_illustrations toFile:illustrationsArrayPath];
if (!result)
    NSLog(@"Failed to archive array");

//This is not saving the originData. 

self.illustrations = nil;

}

4

1 に答える 1

3

関連付けられたオブジェクトAPIを介して追加されたプロパティに対しては、これを実行できないと思います。これは、プロパティがそこにあることを知らないためUIImageです。encodeWithCoder:initWithCoder:

MyUiImage代わりに継承してカスタムを作成できる場合は、クラスのとUIImageをオーバーライドし、プロパティと一緒にプロパティをエンコード/デコードすることができます。encodeWithCoder:initWithCoder:UIImage

于 2012-05-02T10:27:37.687 に答える