使用NSUserDefaults保存NSMutableArray不起作用

Gra*_*ten 7 iphone xcode nsuserdefaults ios

我有这个名为myWallet的可变数组及其属性声明:

@property (nonatomic, strong) NSMutableArray *myWallet;
Run Code Online (Sandbox Code Playgroud)

这个数组正在被卡片填充,这是一个对象.我从另一个View Controller创建了一个新的Card实例,所以我使用了一个委托方法,能够在我的初始View Controller(表视图控制器)上传递这个创建的卡.以下是委托方法

- (void)addCardViewController:(AddCardViewController *)sender didCreateCard:(Card *)newCard
{
    // insert a new card

    self.myCard = newCard;
    [self.myWallet addObject:self.myCard];

    [self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以创建新的Card实例,当我这样做时,我的初始视图控制器(Card Wallet VC)中会出现一个新的表格单元格.

我想要的是当用户完成使用该应用程序时,他/她之前创建的卡片的创建实例仍会出现在应用程序的下一个运行时间.所以我使用NSUserDefaults来做到这一点.下面的方法是我如何使用NSUserDefaults保存.

- (void)saveMyWallet
{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:self.myWallet forKey:@"myWalletArray"];

    [defaults synchronize];
    NSLog(@"I am saved");
}
Run Code Online (Sandbox Code Playgroud)

我在didSelectRowAtIndexPath中调用此方法.当我运行应用程序,然后创建一个新的卡实例,单击表格单元格,这将显示在我的日志中.

2012-05-04 14:51:00.900 CardWallet[24998:f803] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '("<Card: 0x6aa02f0>")' of class '__NSArrayM'.  
Note that dictionaries and arrays in property lists must also contain only property values.
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因?你能告诉我如何解决这个问题吗?

提前致谢.

Jon*_*lli 4

您的 Card 类还必须符合NSCoding 协议,因为您只能存储NSData, NSString, NSArray,NSDictionaryNSNumberwith NSUserDefaults。这意味着,您需要向类中添加两个方法:

- (void)encodeWithCoder:(NSCoder *)enCoder {
    [super encodeWithCoder:enCoder];

    [enCoder encodeObject:instanceVariable forKey:INSTANCEVARIABLE_KEY];

    // Similarly for the other instance variables.
    ....
}

- (id)initWithCoder:(NSCoder *)aDecoder {

   if(self = [super initWithCoder:aDecoder]) {
       self.instanceVariable = [aDecoder decodeObjectForKey:INSTANCEVARIABLE_KEY];

       // similarly for other instance variables
       ....
   }

   return self;
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个 NSData NSKeyedArchiver,然后将其存储到 NSUserDefaults。像这样:

 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
 NSData *yourArrayAsData = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
 [ud setObject:sharesAsData forKey:kA_KEY_FOR_USERDEFAULTS];
Run Code Online (Sandbox Code Playgroud)