iPhone - Perché la documentazione dire UIImageView è NSCoding compatibili?
-
21-08-2019 - |
Domanda
Idealmente, un NSCoding classe conforme funzionerà come previsto l'utilizzo di encodeWithCoder:e initWithCoder:(almeno io la pensavo così fino a poco tempo fa) senza lo sviluppatore dover preoccuparsi di ciò che accade all'interno della routine (a meno che la mia idea di un NSCoding conforme classe sono totalmente incasinato!)
La UIImageView classe è NSCoding compatibile.Quindi dovrei non è necessario preoccuparsi di come sarà serializzato/de-serializzato utilizzando il NSKeyedArchiver e NSKeyedUnarchiver classi.Ma ogni volta che provo a codificare una UIImageView oggetto, ho un errore che UIImage non riconosce encodeWithCoder:metodo.
Ora la UIImageView utilizza internamente un UIImage oggetto.Ma non la codifica si sono presi cura di se stesso?
O è il NSCoding conformità specificato nella documentazione per l'utente di sapere che essi possono attuare initWithCoder e encodeWithCoder metodi?
Per favore qualcuno può chiarire questo per me!Io sono un po ' confuso!
Soluzione
La documentazione è fuorviante -- UIImage
non è conforme a NSCoding
come lei ha dichiarato.Si può lavorare intorno ad esso (in modo primitivo) facendo il lavoro da soli:
@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
Altri suggerimenti
Questa domanda merita un aggiornamento da iOS 5.1 aggiunto funzionalità per NSCoding per UIImage, e Nathan de Vries risposta ora causa avvisi con i compilatori più recenti.
Questa domanda offre una soluzione per aggirare il problema se l'app supporta iOS prima 5.1.Lo fa praticamente la stessa cosa Nathan suggerisce, ma controlla se il metodo esiste già o non, piuttosto che duro a scrivere codice.