Я создал класс 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. Это мой метод сохранения:
- (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 для каждого изображения? Большое спасибо.
ОБНОВИТЬ:
Хорошо, я перешел к подклассу UIImage в классе с именем UIImageExtra и привел его в соответствие с 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, не должен ли он автоматически сохранять исходные данные? Мой код для сохранения массива выглядит так:
- (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;
}