Pregunta

Lo ideal es una clase compatible NSCoding funcionará como se espera utilizando encodeWithCoder: y initWithCoder: (por lo menos me lo imaginaba hasta hace poco) sin que el desarrollador tener que preocuparse acerca de lo que sucede dentro de las rutinas (a menos que mi idea de una clase compatible NSCoding son totalmente metido la pata!)

La clase UIImageView se NSCoding compatible. Así que no debería tener que preocuparse cómo va a ser serializado / de serializada que consumen las clases NSKeyedArchiver y NSKeyedUnarchiver. Pero cada vez que intento y codificar un objeto UIImageView, me sale un error que UIImage no reconoce encodeWithCoder:. Método

Ahora el UIImageView internamente usa un objeto UIImage. Pero no debe haber la codificación ocupado de eso sí misma?

O es el cumplimiento NSCoding especifica en la documentación de dejar que el usuario sepa que puedan poner en práctica el initWithCoder y métodos encodeWithCoder?

Por favor alguien puede aclarar esto para mí! Estoy completamente confundido!

¿Fue útil?

Solución

La documentación es engañosa - UIImage no se ajuste a NSCoding como usted ha indicado. Puede trabajar alrededor de ella (de una manera primitiva) haciendo el trabajo usted mismo:

@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

Otros consejos

Esta pregunta merece una actualización desde iOS 5.1 añade funcionalidad para NSCoding a UIImage, y Nathan de Vries respuesta ahora hará que las advertencias de nuevos compiladores.

Esta pregunta ofrece una solución a evitar el problema si su aplicación soporta iOS antes de 5.1. Lo hace básicamente lo mismo que Nathan sugiere, pero comprueba si el método ya existe o no, en lugar de codificar duro a él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top