2009-07-02 5 views
12

理想的には、NSCodingに準拠したクラスは、encodeWithCoder:とinitWithCoder:を使用して、期待通りに動作します(開発者がルーチン内で何が起こっているか気にする必要はありません)ねじ込み!)iPhone - UIImageViewがNSCodingに準拠しているとドキュメントに書かれているのはなぜですか?

UIImageViewクラスはNSCodingに準拠しています。ですから、NSKeyedArchiverクラスとNSKeyedUnarchiverクラスを使ってシリアライズ/デシリアライズする方法を気にする必要はありません。しかし、UIImageViewオブジェクトを試してエンコードするたびに、UIImageがencodeWithCoder:メソッドを認識しないというエラーが発生します。

UIImageViewは内部的にUIImageオブジェクトを使用します。しかし、エンコーディングはそれ自体を処理してはいけませんか?

または、initWithCoderメソッドとencodeWithCoderメソッドを実装できることをユーザーに通知するために、NSCodingの準拠がドキュメントに記載されていますか?

誰かが私にこれを明確にしてもらえますか?私は完全に混乱しています!

答えて

33

文書が誤解を招く - UIImageは、あなたが言ったようにNSCodingに準拠していません。この質問はUIImageにNSCodingのための機能を追加したのiOS 5.1以降の更新に値する

@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

ありがとう、私はすでにそれをやっています。なぜAppleが開発者を誤解させているのだろうかと疑問に思っているだけです。 3.0では、ドキュメントのUIImagePickerControllerの新しいメソッドに関する記述はありません。 – lostInTransit

+1

もちろん、Radarのドキュメントのバグを報告してください(OpenRadarに追加して、他の人が進行状況を追跡できるようにしてください)。 –

+0

ありがとうNathan de Vriesあなたの答えは、CoreDataを扱う際に私を助けてくれます! –

8

、とネイサン・デ・フリースの答えは、今で警告を発生します:あなたは自分で仕事をしていることにより、(原始的な方法で)それを回避することができます最新のコンパイラ。

This question offers a solutionあなたのアプリが5.1より前のiOSをサポートしている場合は、この問題を回避できます。 Nathanの提案と基本的に同じですが、ハードコーディングではなく、メソッドがすでに存在するかどうかをチェックします。

+0

うれしい私はページの下までスクロールしました!歓声の仲間 –

+0

これを投票した人は誰でもスプーンで殴られるべきです:P – DougW

関連する問題