2012-12-10 43 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; 
}