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

Seg*_*gev 5 arrays objective-c 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];
Run Code Online (Sandbox Code Playgroud)

所以基本上它是一个包含不同属性的对象的数组.

我尝试使用下一个代码将单个字符串保存到文件中并且它工作正常但是当我尝试使用对象保存数组时,我得到一个空的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];
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ano*_*dya 1

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

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

编辑:

像这样的事情:根据您的要求将浮点更改为整数或字符串或数组,并为它们提供合适的键。

- (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;
}
Run Code Online (Sandbox Code Playgroud)

即使这样也会对你有帮助。