Pergunta

O ideal é uma classe compatível NSCoding funcionará como esperado usando encodeWithCoder: e initWithCoder: (pelo menos eu pensava assim até recentemente), sem o desenvolvedor ter que se preocupar sobre o que acontece dentro das rotinas (a menos que a minha ideia de uma classe compatível NSCoding são totalmente asneira!)

A classe UIImageView é compatível NSCoding. Então, eu não deveria ter que se preocupar como ele vai ser serializado / de-serializado usando as classes NSKeyedArchiver e NSKeyedUnarchiver. Mas cada vez que eu tento e codificar um objeto UIImageView, eu recebo um erro que UIImage não reconhece encodeWithCoder:. Método

Agora, o UIImageView internamente usa um objeto UIImage. Mas não deve a codificação ter cuidado de que se?

Ou é o cumprimento NSCoding especificado na documentação apenas deixar o know usuário que possam implementar o initWithCoder e métodos encodeWithCoder?

Por favor alguém pode esclarecer isso para mim! Estou completamente confuso!

Foi útil?

Solução

A documentação é enganosa - UIImage não se conforma com NSCoding como você indicou. Você pode trabalhar em torno dele (de uma forma primitiva) fazendo o trabalho sozinho:

@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

Outras dicas

Esta questão merece uma atualização desde iOS 5.1 funcionalidades adicionais para NSCoding para UIImage e resposta Nathan de Vries irá agora causa avisos com as mais recentes compiladores.

Esta pergunta oferece uma solução Para contornar o problema se seu aplicativo suportes iOS anteriores para 5,1. Ele faz basicamente a mesma coisa Nathan sugere, mas verifica se o método já existe ou não, em vez de disco rígido codificação-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top