将具有属性的对象数组保存到plist

时间:2012-12-10 12:45:44

标签: objective-c arrays plist

我有一个包含不同对象的Mutable数组,如字符串,UIImage等。 它们的排序如下:

示例:

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];

我做错了什么?

3 个答案:

答案 0 :(得分:1)

当您将字符串或任何原始数据写入plist时,可以直接保存。但是当您尝试保存对象时,需要使用NSCoding。

您必须实现两个方法encodeWithCoder:来编写,initWithCoder:在BugData类中读取它。

编辑:

这样的事情: 根据您的要求将Float更改为Integer或String或Array,并为它们提供合适的密钥。

- (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也可以为您提供帮助。

答案 1 :(得分:1)

NSCoding课程中实施BugData,如下所示

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

答案 2 :(得分:0)

BugData必须实现NSCoding协议。您需要使用此方法对数据进行编码:

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

您应该在哪里提供表示类的NSData对象(用解码器解码) 要阅读plist,您需要实现此方法:

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

从解码器读取数据并返回BugData对象的地方。