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

StackOverflow https://stackoverflow.com/questions/1072700

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

Может кто-нибудь, пожалуйста, проясните это для меня!Я в полном замешательстве!

Это было полезно?

Решение

Документация вводит в заблуждение - 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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top