我有一个包含很多单词的tableview,我想添加收藏夹功能,因此每个细节视图都可以有一个按钮保存为收藏夹。这是我的代码,但是没有工作,按下按钮后我得到了这个错误(属性列表不能包含' CFType'类型的对象),但如果我使用slovoItem.slovo或slovoItem.definice ,值正确保存。 slovoItem的值为slovoItem.slovo和slovoItem.definice,我需要完全保存slovoItem。
我的DetailViewController中的代码:
- (IBAction) addToFavorites:(id)sender
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSMutableArray *tempArray = [[prefs objectForKey:@"favorite"] mutableCopy];
favorite = tempArray;
[favorite addObject:self.slovoItem];
[prefs setObject:favorite forKey:@"favorite"];
for (id obj in favorite)
{
NSLog(@"%@", obj);
}
}
答案 0 :(得分:2)
自定义对象无法写入用户默认值,只能写入NSString,NSData,NSNumber,NSDate,NSArray和NSDictionary类型。容器类型必须包含6种允许类型的项目。
保存自定义类型的常用方法是符合NSCoding协议。 在@interface行中添加协议
@interface SlovoItem : NSObject <NSCoding> {
在.m文件中,您必须实施initWithCoder:
和encodeWithCoder:
方法:
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
self.slovo = [coder decodeObjectForKey:@"slovo"];
self.definice = [coder decodeObjectForKey:@"definice"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.slovo forKey:@"slovo"];
[coder encodeObject:self.definice forKey:@"definice"];
}
现在您可以使用
保存自定义类型 - (IBAction) addToFavorites:(id)sender
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *favorite = [[defaults objectForKey:@"favorite"] mutableCopy];
[favorite addObject:[NSKeyedArchiver archivedDataWithRootObject:self.slovoItem]];
[defaults setObject:favorite forKey:@"favorite"];
}
归档程序将自定义类型编码为NSData对象
代码是一个示例,未经过测试。可能存在拼写错误