2009-07-02 11 views
12

Idealmente, una clase compatible con NSCoding funcionará como se esperaba utilizando encodeWithCoder: y initWithCoder: (al menos eso creí hasta hace poco) sin que el desarrollador tenga que preocuparse por lo que sucede dentro de las rutinas (a menos que mi idea de una clase compatible con NSCoding atornillado!)iPhone - ¿Por qué la documentación dice que UIImageView es compatible con NSCoding?

La clase UIImageView cumple con NSCoding. Así que no debería tener que preocuparme de cómo será serializado/deserializado usando las clases NSKeyedArchiver y NSKeyedUnarchiver. Pero cada vez que intento codificar un objeto UIImageView, aparece el error de que UIImage no reconoce el método encodeWithCoder.

Ahora el UIImageView utiliza internamente un objeto UIImage. Pero, ¿no debería la codificación haberse ocupado de eso?

¿O está especificado el cumplimiento con NSCoding en la documentación para que el usuario sepa que puede implementar los métodos initWithCoder y encodeWithCoder?

¿Alguien puede aclarar esto para mí! ¡Estoy completamente confundido!

Respuesta

33

La documentación es engañosa - UIImage no se ajusta 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 
+1

Gracias, ya lo estoy haciendo. Solo me pregunto (despotricando realmente) por qué Apple podría engañar a los desarrolladores. Lo mismo con el 3.0 que no menciona el nuevo método en UIImagePickerController en los documentos. – lostInTransit

+1

Archivar definitivamente un error de documentación en Radar (y agregarlo a OpenRadar también para que otros puedan seguir el progreso). –

+0

Gracias Nathan de Vries. ¡Tu respuesta me ayuda mucho cuando tratas con CoreData! –

8

Esta pregunta merece una actualización desde iOS 5.1 funcionalidad añadida para NSCoding a UIImage, y Nathan de Vries respuesta ahora va a causar advertencias con el últimos compiladores

This question offers a solution para solucionar el problema si su aplicación es compatible con iOS anterior a la 5.1. Básicamente, hace lo mismo que Nathan sugiere, pero verifica si el método ya existe o no, en lugar de codificarlo con dificultad.

+0

Me alegro de haber recorrido toda la página! Cheers buddy –

+0

Quien haya votado esto debe ser golpeado con una cuchara: P – DougW

Cuestiones relacionadas