6

我有一个可变数组,其中包含不同的对象,例如字符串、 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];

我究竟做错了什么?

4

3 回答 3

1

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

您必须在您的 BugData 类中实现两种方法encodeWithCoder:来写入和读取它。initWithCoder:

编辑:

像这样:根据您的要求将 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;
}

即使会对你有所帮助。

于 2012-12-10T12:57:03.213 回答
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;
}
于 2012-12-10T13:06:00.903 回答
0

BugData 必须实现 NSCoding 协议。你需要这个方法来编码数据:

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

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

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

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

于 2012-12-10T12:51:47.923 回答