Objective c 使用NSUserDefaults保存我的阵列

Objective c 使用NSUserDefaults保存我的阵列,objective-c,arrays,singleton,persistence,nsuserdefaults,Objective C,Arrays,Singleton,Persistence,Nsuserdefaults,我的电脑有问题。请容忍我,因为这是我第一次实施它 我试图存储到手机的数据是我的电子商务应用程序购物车的一个对象数组,该数组将加载购物车的表视图以显示添加到购物车的所有项目 数组中有两种不同类型的对象具有不同的属性NSString和NSNumber:产品名称、大小、价格等。。有人向我建议,可能我的数组中有太多的属性无法放入plist,这就是为什么没有任何东西可以保存 这是我的密码。我使用的是singleton方法,并已将此代码插入到我的singleton类中 我可以在我的Documents目录中看

我的电脑有问题。请容忍我,因为这是我第一次实施它

我试图存储到手机的数据是我的电子商务应用程序购物车的一个对象数组,该数组将加载购物车的表视图以显示添加到购物车的所有项目

数组中有两种不同类型的对象具有不同的属性NSString和NSNumber:产品名称、大小、价格等。。有人向我建议,可能我的数组中有太多的属性无法放入plist,这就是为什么没有任何东西可以保存

这是我的密码。我使用的是singleton方法,并已将此代码插入到我的singleton类中

我可以在我的Documents目录中看到创建了plist。但是里面什么都没有

编辑

我刚在日志中注意到:

CityBicycleCompany[4239:249463]属性列表格式无效:200 属性列表不能包含“CFType”类型的对象2014-12-07 20:52:10.037城市自行车公司[4239:249463]尝试设置 非属性列表对象 作为键tableViewCartData的NSUserDefaults/CFPreferences值

我不知道这是什么意思。什么是CFA类型

编辑2

这是self.cartArray的po,它在cart中添加了一个对象。ChosenAccessory是我添加到购物车中的自定义对象

<__NSArrayM 0x79788380>( <ChosenAccessory: 0x796d1f80> )

不能直接在NSUserDefault中保存包含自定义对象的数组,apple doc:首选项值必须是标准属性列表对象类型之一:NSData、NSString、NSNumber、NSDate、NSArray或NSDictionary

解决方法是为自定义对象提供编码器/解码器。 在项目类中添加:

- (void)encodeWithCoder:(NSCoder *)coder{

//for each attribute of your class that you need to store, (NSString, Date, NSNumber...)

    [coder encodeObject:self.recordID forKey:@"recordID"];//NSNumber
    [coder encodeObject:self.phone forKey:@"phone"];//NSString
    [coder encodeObject:self.date forKey:@"date"];//nsdate

}

- (Item*)initWithCoder:(NSCoder *)decoder {
    if (self == [super init]) {
        self.recordID = [decoder decodeObjectForKey:@"recordID"];
        self.phone = [decoder decodeObjectForKey:@"phone"];
        self.date =[decoder decodeObjectForKey:@"date"];
    }
    return self;
}
在viewController中,这里介绍如何初始化和保存项目数组

-(void)initItems{

    self.itemsArray = [[NSMutableArray alloc]init];
    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults];

    NSString* savedItems = @"savedItems";

    if([preferences objectForKey: savedItems] == nil)
    {
//handle

    }
    else
    {
        NSMutableArray *archiveArray = [preferences objectForKey: savedItems];
        for (NSData* itemObj in archiveArray) {
            Item *item = [NSKeyedUnarchiver unarchiveObjectWithData: itemObj];
            [self.itemsArray addObject:item];
        }

    }

}


-(void)saveItemsArray{

    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults];

    NSString* savedItems = @"savedItems";

    NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:[self.itemsArray count]];

    for (Item* item in self.itemsArray) {
        NSData* itemObj = [NSKeyedArchiver archivedDataWithRootObject:item];
        [archiveArray addObject:itemObj];

    }

    [preferences setObject:archiveArray forKey: savedItems];
    [preferences synchronize];

}

您使用的是可变的还是可变的nsarray@NullDataNSMutableArray若要保存为NSUserDefaults,阵列中的所有内容都必须符合plist,而且看起来可能不符合plist。你能打印出cartArray的内容并将其添加到问题中吗?@BenFlynn我刚刚发布了它。我猜它不会接受它,因为我正在用自定义对象填充数组,对吗?使用nsarray它会工作的
-(void)initItems{

    self.itemsArray = [[NSMutableArray alloc]init];
    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults];

    NSString* savedItems = @"savedItems";

    if([preferences objectForKey: savedItems] == nil)
    {
//handle

    }
    else
    {
        NSMutableArray *archiveArray = [preferences objectForKey: savedItems];
        for (NSData* itemObj in archiveArray) {
            Item *item = [NSKeyedUnarchiver unarchiveObjectWithData: itemObj];
            [self.itemsArray addObject:item];
        }

    }

}


-(void)saveItemsArray{

    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults];

    NSString* savedItems = @"savedItems";

    NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:[self.itemsArray count]];

    for (Item* item in self.itemsArray) {
        NSData* itemObj = [NSKeyedArchiver archivedDataWithRootObject:item];
        [archiveArray addObject:itemObj];

    }

    [preferences setObject:archiveArray forKey: savedItems];
    [preferences synchronize];

}