添加项目并将其保存到收藏夹

时间:2015-06-27 14:21:50

标签: ios xcode uitableview nsuserdefaults

我有一个包含很多单词的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);
    }
}

1 个答案:

答案 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对象

代码是一个示例,未经过测试。可能存在拼写错误