2012-05-02 4 views
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, а массив называется иллюстрациями. Когда я копирую экземпляр 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 для каждого изображения сохраняется? Большое спасибо.

UPDATE:

Хорошо, я изменил к подклассам 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; 

}

ответ

3

Я не думаю, что вы можете сделать это за свойства добавили через связанный объект API, потому что UIImage «s encodeWithCoder: и initWithCoder: не имеет ни малейшего представления о том, что ваши свойства есть.

Если вы можете создать свой собственный MyUiImage путем наследования UIImage вместо этого, вы могли бы переопределить encodeWithCoder: и initWithCoder: вашего класса, и кодировать/декодировать свойства наряду с UIImage из них.

+0

О, это позор ... Это не так удобно, используя наследование. Но я думаю, это имеет смысл, спасибо. – Smikey

+0

Я обновил свой ответ, если бы вы могли еще раз взглянуть? – Smikey

+0

@Smikey Ваше обновление должно работать. Я предполагаю, что вы явно приняли протокол '' в вашем подклассе, правильно? Также вы можете переместить '[super encodeWithCoder: aCoder];' впереди остальной части кода, чтобы соответствовать примерам Apple (я не думаю, что это имеет значение в этом случае). – dasblinkenlight

 Смежные вопросы

  • Нет связанных вопросов^_^