追加のプロパティとメソッドを含めたいので、UIImage (UIImageExtra) のサブクラスを作成しました。
このカスタム クラスのインスタンスを含む配列があります。ただし、配列を保存すると、UIImageExtra クラスの余分なデータが保存されていないように見えます。
UIImageExtra は NSCoding に準拠していますが、追加した NSLog ステートメントが出力されないため、initWithCoder も encodeWithCoder も呼び出されません。
配列を保存する私の方法は次のようになります。
- (void)saveIllustrations {
if (_illustrations == nil) {
NSLog(@"Nil array");
return;
}
[self createDataPath];
//Serialize the data and write to disk
NSString *illustrationsArrayPath = [_docPath stringByAppendingPathComponent:kIllustrationsFile];
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:_illustrations forKey:kIllustrationDataKey];
[archiver finishEncoding];
[data writeToFile:illustrationsArrayPath atomically: YES];
}
また、UIImageExtra には、保存用の次のデリゲート メソッドがあります。
#pragma mark - NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
NSLog(@"Encoding origin data!");
[super encodeWithCoder:aCoder];
[aCoder encodeObject:originData forKey:kOriginData];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:(NSCoder *) aDecoder]) {
NSLog(@"Decoding origin data");
self.originData = [aDecoder decodeObjectForKey:kOriginData];
}
return self;
}
最初に配列を作成するための私のコードは次のようになります(手がかりが得られる場合)
for (NSDictionary *illustrationDict in illustrationDicts) {
NSString *illustrationString = [illustrationDict objectForKey:@"Filename"];
NSNumber *xCoord = [illustrationDict objectForKey:@"xCoord"];
NSNumber *yCoord = [illustrationDict objectForKey:@"yCoord"];
UIImageExtra *illustration = (UIImageExtra *)[UIImage imageNamed:illustrationString];
//Scale the illustration to size it for different devices
UIImageExtra *scaledIllustration = [illustration adjustForResolution];
NSValue *originData = [NSValue valueWithCGPoint:CGPointMake([xCoord intValue], [yCoord intValue])];
[scaledIllustration setOriginData:originData];
[self.illustrations addObject:scaledIllustration];
}
それとも、このデータを間違った方法で保存しようとしているのでしょうか? どうもありがとう。