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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top