Question

Idéalement une classe compatible NSCoding fonctionnera comme prévu en utilisant encodeWithCoder: et initWithCoder: (au moins je pensais ainsi jusqu'à récemment) sans le développeur d'avoir à se soucier de ce qui se passe à l'intérieur des routines (à moins que mon idée d'une classe compatible NSCoding sont déconné!)

La classe UIImageView est NSCoding conforme. Donc, je ne devrais pas avoir à se soucier comment il sera publié en feuilleton / désérialisé en utilisant les classes NSKeyedArchiver et NSKeyedUnarchiver. Mais chaque fois que j'essaie et encodez un objet UIImageView, je reçois une erreur qui UIImage ne reconnaît pas encodeWithCoder. Méthode

Maintenant, le UIImageView utilise en interne un objet UIImage. Mais ne devrait pas l'encodage pris soin de lui-même qui?

Ou est le respect NSCoding spécifié dans la documentation juste laisser l'utilisateur savent qu'ils peuvent mettre en œuvre le initWithCoder et les méthodes de encodeWithCoder?

Quelqu'un peut-il s'il vous plaît préciser pour moi! Je suis complètement confus!

Était-ce utile?

La solution

La documentation est trompeuse - ne se conforme pas UIImage à comme vous l'avez NSCoding déclaré. Vous pouvez travailler autour d'elle (d'une manière primitive) en faisant le travail vous-même:

@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

Autres conseils

Cette question mérite une mise à jour depuis iOS 5.1 pour ajouter des fonctionnalités à NSCoding UIImage et réponse Nathan de Vries va maintenant causer des avertissements avec les derniers compilateurs.

Cette question offre une solution pour contourner le problème si votre application prend en charge iOS avant 5,1. Il fait essentiellement la même chose Nathan suggère, mais vérifie si la méthode existe déjà ou non, plutôt que de coder en dur il.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top