2009-07-02 4 views
12

Idealerweise funktioniert eine NSCoding-konforme Klasse wie erwartet mit encodeWithCoder: und initWithCoder: (zumindest dachte ich das bis vor kurzem), ohne dass der Entwickler sich Gedanken darüber machen müsste, was in den Routinen vor sich geht (es sei denn, meine Idee einer NSCoding-konformen Klasse ist vollkommen) vermasselt!)iPhone - Warum heißt es in der Dokumentation, dass UIImageView mit NSCoding kompatibel ist?

Die UIImageView-Klasse ist NSCoding-konform. Ich sollte mich also nicht darum kümmern müssen, wie es mit den Klassen NSKeyedArchiver und NSKeyedUnarchiver serialisiert/de-serialisiert wird. Aber jedes Mal, wenn ich versuche, ein UIImageView-Objekt zu codieren, erhalte ich den Fehler, dass UIImage die Methode encodeWithCoder: method nicht erkennt.

Jetzt verwendet das UIImageView intern ein UIImage-Objekt. Aber sollte sich die Verschlüsselung nicht selbst darum kümmern?

Oder ist die NSCoding-Kompatibilität in der Dokumentation angegeben, damit der Benutzer einfach weiß, dass er die Methoden initWithCoder und encodeWithCoder implementieren kann?

Kann jemand bitte dies für mich klären! Ich bin völlig verwirrt!

Antwort

33

Die Dokumentation ist irreführend - UIImage entspricht nicht NSCoding, wie Sie gesagt haben. Sie können (in einer primitiven Weise) um es arbeiten, indem sie die Arbeit selbst zu tun:

@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

Danke, das mache ich schon. Ich frage mich nur (wirklich schimpfend), warum Apple die Entwickler irreführen würde! Das gleiche gilt für die 3.0-Methode, die in der neuen Methode in UIImagePickerController in den Dokumenten keine Erwähnung findet. – lostInTransit

+1

Dokumentieren Sie auf jeden Fall einen Dokumentationsfehler in Radar (und fügen Sie ihn auch zu OpenRadar hinzu, damit andere den Fortschritt verfolgen können). –

+0

Danke Nathan de Vries. Ihre Antwort hilft mir sehr im Umgang mit CoreData! –

8

Diese Frage seit iOS 5.1 hinzugefügt Update verdient Funktionalität für NSCoding zu UIImage und Nathan de Vries Antwort wird nun dazu führen, Warnungen mit der neueste Compiler.

This question offers a solution um das Problem zu umgehen, wenn Ihre App iOS vor 5.1 unterstützt. Es tut im Grunde dasselbe, was Nathan vorschlägt, aber es prüft, ob die Methode bereits existiert oder nicht, anstatt sie hart zu kodieren.

+0

Ich bin froh, dass ich den ganzen Weg hinuntergescrollt habe! Cheers Kumpel –

+0

Wer auch immer unten abgestimmt dies sollte mit einem Löffel geschlagen werden: P – DougW

Verwandte Themen