2012-12-10 15 views
5

mam Zmienna tablica zawierająca różne obiekty, takie jak ciągi, UIImage itp są posortowane tak:Zapisz Tablica obiektów z właściwościami do PLIST

Przykład:

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

Więc w zasadzie to tablica z obiektami o różnych właściwościach.

Próbowałem zapisać pojedynczy ciąg do pliku z następnym kodem i działa dobrze, ale kiedy próbuję zapisać tablicę razem z obiektami, otrzymuję pusty plik plist.

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

Co robię źle?

+0

Czy realizowane 'NSCoding' w swojej klasie' Bug' ?? –

Odpowiedz

1

Podczas pisania łańcucha lub dowolnych prymitywnych danych do plist można go zapisać bezpośrednio. Ale gdy próbujesz zapisać obiekt, musisz użyć NSCoding.

Musisz zaimplementować dwie metody: encodeWithCoder: do napisania i initWithCoder:, aby odczytać je z powrotem w klasie BugData.

EDIT:

coś takiego: Zmień Float na Integer lub String lub Array jak na swoje wymagania i dać odpowiedni klucz do nich.

- (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; 
} 

Pomoże ci nawet this.

0

BugData musi implementować NSCoding protocol.You potrzebują tej metody, aby zakodować dane:

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

Gdzie należy podać przedmiot NSData reprezentujący klasę (dekodować go z dekoderem).
Aby przeczytać plist trzeba zaimplementować tę metodę:

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

Gdzie odczytać dane z dekodera i zwraca obiekt BugData.

1

Wdrożenie NSCoding w swojej klasie BugData jak poniżej

- (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; 
}