iPhone - Por que a documentação diz UIImageView é compatível NSCoding?
-
21-08-2019 - |
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!
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.