2012-12-10 20 views
5

Ich habe einen änderbaren Array verschiedene Objekte wie Zeichenketten enthalten, UIImage usw. Sie sind wie folgt sortiert:Speichern Array von Objekten mit Eigenschaften plist

Beispiel:

BugData *bug1 = [[BugData alloc]initWithTitle:@"Spider" rank:@"123" thumbImage:[UIImage imageNamed:@"1.jpeg"]]; 
... 
... 
NSMutableArray *bugs = [NSMutableArray arrayWithObjects:bug1,bug2,bug3,bug4, nil]; 

Also im Grunde ist es ein Array mit Objekten mit unterschiedlichen Eigenschaften.

Ich habe versucht, eine einzelne Zeichenfolge in einer Datei mit dem nächsten Code zu speichern, und es funktioniert gut, aber wenn ich versuche, das Array mit den Objekten zu speichern, erhalte ich eine leere PLIST-Datei.

NSString *docsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
NSString * path = [docsDir stringByAppendingPathComponent:@"data.plist"]; 
NSLog(@"%@",bugs); //Making sure the array is full 
[bugs writeToFile:path atomically:YES]; 

Was mache ich falsch?

+0

implementiert haben Sie 'NSCoding' in Ihrer' Bug' Klasse ?? –

Antwort

1

Wenn Sie eine Zeichenkette oder irgendwelche primitiven Daten zu plist schreiben, kann sie direkt gespeichert werden. Wenn Sie jedoch versuchen, ein Objekt zu speichern, müssen Sie NSCoding verwenden.

Sie müssen zwei Methoden implementieren encodeWithCoder: zu schreiben und initWithCoder:, um es wieder in Ihrer BugData-Klasse zu lesen.

EDIT:

Etwas wie folgt aus: ändern Float auf Integer oder String oder Array wie pro Ihre Anforderung und einen geeigneten Schlüssel zu ihnen geben.

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeObject:_title forKey:@"title"]; 
    [coder encodeFloat:_rating forKey:@"rating"]; 
    NSData *image = UIImagePNGRepresentation(_thumbImage); 
    [coder encodeObject:(image) forKey:@"thumbImage"]; 
} 


- (id)initWithCoder:(NSCoder *)coder { 
    _title = [coder decodeObjectForKey:@"title"]; 
    _rating = [coder decodeFloatForKey:@"rating"]; 
    NSData *image = [coder decodeObjectForKey:@"thumbImage"]; 
    _thumbImage = [UIImage imageWithData:image]; 
    return self; 
} 

Auch this wird Ihnen helfen.

0

BugData die NSCoding protocol.You müssen diese Methode implementieren, müssen die Daten kodieren:

- (void) encodeWithCoder: (NSCoder*) encoder; 

Wo Sie ein NSData Objekt liefern, um die Klasse darstellt (dekodieren es mit dem Decoder).
Zum Lesen der plist Sie müssen diese Methode implementieren:

-(id) initWithCoder: (NSCoder*) decoder; 

Wo Sie Daten aus dem Decoder lesen und ein BugData Objekt zurück.

1

Implementieren NSCoding in Ihrer BugData Klasse wie unten

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeFloat:title forKey:@"title"]; 
    [coder encodeFloat:rank forKey:@"rank"]; 
    [coder encodeObject:UIImagePNGRepresentation(thumbImage) forKey:@"thumbImageData"]; 
} 




- (id)initWithCoder:(NSCoder *)coder { 
    title = [coder decodeFloatForKey:@"title"]; 
    rank = [coder decodeFloatForKey:@"rank"]; 
    NSData *imgData = [coder decodeObjectForKey:@"thumbImageData"]; 
    thumbImage = [UIImage imageWithData:imgData ]; 
    return self; 
} 
Verwandte Themen