iPhone - Почему в документации сказано, что UIImageView совместим с NSCoding?

В идеале класс, совместимый с NSCoding, будет работать, как ожидалось, с использованием encodeWithCoder: и initWithCoder: (по крайней мере, я так думал до недавнего времени), и разработчику не нужно беспокоиться о том, что происходит внутри подпрограмм (если только моя идея о классе, совместимом с NSCoding, полностью облажалась !)

Класс UIImageView совместим с NSCoding. Поэтому мне не нужно беспокоиться о том, как он будет сериализован / десериализован с использованием классов NSKeyedArchiver и NSKeyedUnarchiver. Но каждый раз, когда я пытаюсь закодировать объект UIImageView, я получаю сообщение об ошибке, которое UIImage не распознает метод encodeWithCoder :.

Теперь UIImageView внутренне использует объект UIImage. Но разве кодировка не должна была позаботиться об этом сама?

Или соответствие NSCoding указано в документации, чтобы просто дать пользователю знать, что он может реализовать методы initWithCoder и encodeWithCoder?

Кто-нибудь может прояснить это для меня! Я полностью запутался!


person lostInTransit    schedule 02.07.2009    source источник


Ответы (2)


Документация вводит в заблуждение - UIImage не соответствует NSCoding, как вы заявили. Вы можете обойти это (примитивно), выполнив работу самостоятельно:

@interface UIImage (NSCoding)
- (id)initWithCoder:(NSCoder *)decoder;
- (void)encodeWithCoder:(NSCoder *)encoder;
@end

@implementation UIImage (NSCoding)
- (id)initWithCoder:(NSCoder *)decoder {
  NSData *pngData = [decoder decodeObjectForKey:@"PNGRepresentation"];
  [self autorelease];
  self = [[UIImage alloc] initWithData:pngData];
  return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
  [encoder encodeObject:UIImagePNGRepresentation(self) forKey:@"PNGRepresentation"];
}
@end
person Nathan de Vries    schedule 02.07.2009
comment
Спасибо, я уже делаю это. Просто интересно (правда, разглагольствовать), почему Apple ввела разработчиков в заблуждение! То же самое с версией 3.0, в которой не упоминается новый метод в UIImagePickerController в документации. - person lostInTransit; 02.07.2009
comment
Обязательно сообщите об ошибке в документации в Radar (и добавьте ее в OpenRadar, чтобы другие могли отслеживать прогресс). - person Nathan de Vries; 03.07.2009
comment
Спасибо, Натан де Врис. Ваш ответ мне очень помогает при работе с CoreData! - person Tuyen Nguyen; 25.04.2012
comment
Определенно хорошее и правильное решение в то время. Однако в iOS были внесены некоторые недавние изменения, которые влияют на этот метод. Я ссылаюсь на более подробное объяснение в новом ответе, который я опубликовал. - person DougW; 15.06.2012
comment
правильно ли это сохранит и загрузит свойство изображения scale? - person user102008; 06.10.2012

Этот вопрос заслуживает обновления, поскольку в iOS 5.1 добавлена ​​функция NSCoding для UIImage, и ответ Натана де Вриза теперь будет вызывать предупреждения с последними компиляторами.

Этот вопрос предлагает решение, позволяющее обойти проблему, если ваше приложение поддерживает iOS ранее к 5.1. По сути, он делает то же самое, что предлагает Натан, но проверяет, существует ли метод уже или нет, а не жестко его кодирует.

person DougW    schedule 14.06.2012
comment
Рад, что пролистал страницу до конца! Ура приятель - person Sam Clewlow; 20.06.2012