理想情况下,NSCoding兼容类将使用encodeWithCoder和initWithCoder按预期工作:(至少我认为直到最近)没有开发人员不必理解例程内部的内容(除非我对NSCoding兼容类的想法是完全搞砸了!)
UIImageView类符合NSCoding标准。所以我不应该打扰如何使用NSKeyedArchiver和NSKeyedUnarchiver类对它进行序列化/反序列化。但每次我尝试编码UIImageView对象时,都会收到UIImage无法识别的错误:encodeWithCoder:method。
现在UIImageView内部使用UIImage对象。但编码是否应该自己解决这个问题呢?
或者文档中指定的NSCoding合规性是否让用户知道他们可以实现initWithCoder和encodeWithCoder方法?
有人可以帮我澄清一下!我很困惑!
答案 0 :(得分:33)
文档具有误导性 - UIImage
不符合您所说的NSCoding
。您可以通过自己完成工作来解决它(以原始方式):
@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
答案 1 :(得分:8)
这个问题值得更新,因为iOS 5.1为NSCoding添加了UIImage的功能,而Nathan de Vries的回答现在会引起最新编译器的警告。
如果您的应用支持5.1之前的iOS,请This question offers a solution解决此问题。它与Nathan建议的基本相同,但检查方法是否已经存在,而不是硬编码。