2012-12-10 69 views
5

我有一個包含不同的對象,如字符串的UIImage等 它們進行排序這樣的可變數組:對象保存陣列性能的plist

例子:

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

所以基本上它是具有不同屬性的對象的數組。

我試圖用下一個代碼保存單個字符串到一個文件,它的工作正常,但是當我嘗試與對象保存數組時,我得到一個空的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]; 

我在做什麼錯?

+0

你有沒有在你的'Bug'類實現'NSCoding'? –

回答

1

當你寫一個字符串或任何原始數據到plist它可以直接保存。但是當你嘗試保存一個對象時,你需要使用NSCoding。

你必須實現兩個方法encodeWithCoder:寫和initWithCoder:讀回你的BugData類。

編輯:

事情是這樣的: 更改浮點數到整數或字符串數​​組或者按照您的要求,並給予適當的鑰匙給他們。

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

即使this會幫助你。

0

BugData必須實現NSCoding protocol.You需要這種方法對數據進行編碼:

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

在哪裏,你應該提供代表類NSData對象(與解碼器解碼的話)。
要閱讀需要實現此方法的plist:你從哪兒解碼器讀取數據

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

,並返回一個BugData對象。

1

實現NSCodingBugData類,如下

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