保存并加载NSMutableArray - NSUserDefaults

时间:2014-08-11 10:45:19

标签: ios objective-c nsmutablearray nsuserdefaults

我正在尝试将NSMutableArray保存到NSUserDefaults,然后重新加载并使用它来填充按钮标签。有人可以看看,告诉我我在这里做错了什么?

当我将文件加载到新数组时,它显示为空。我试图设置标题的所有按钮都在ibCollectionOutlet中,称为按钮

-(void)save {
    [[NSUserDefaults standardUserDefaults] setObject:self.pressCountArray forKey:@"savedFile"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(void)load{

    NSMutableArray *countArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"savedFile"] mutableCopy];

    for (NSInteger i = 0; i < [self.pressCountArray count]; i++){
        self.pressCountArray[i] = countArray[i];
    }

    for (NSInteger i = 0; i < [self.buttons count]; i++){
        UIButton *btn = self.buttons[i];
        int curCnt = [[self.pressCountArray objectAtIndex:i] integerValue];

        [btn setTitle:[NSString stringWithFormat:@"%i",curCnt] forState:UIControlStateNormal];
    }
}

2 个答案:

答案 0 :(得分:4)

我认为你的数组包含自定义对象。 如果是这种情况,那么您应该在自定义模型类中实现NSCoding协议(用于序列化和反序列化)。

在您的班级中实施以下NSCoding协议方法:

- (void)encodeWithCoder:(NSCoder *)encoder;
- (id)initWithCoder:(NSCoder *)decoder;

之后保存数据:

NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.pressCountArray];
[[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:[NSString stringWithFormat:@"savedFile"]];

并检索如下数据:

NSData *encodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"savedFile"]];
self.pressCountArray  = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];

答案 1 :(得分:0)

看起来你在加载过程中没有分配self.pressCountArray,并且可能正在尝试填充一个空数组(以一种相当奇怪的方式)。而只是做:

-(void)load{

    self.pressCountArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"savedFile"] mutableCopy];

    NSAssert([self.pressCountArray count] == [self.buttons count], @"Array count mismatch");

    for (NSInteger i = 0; i < [self.buttons count]; i++){
        UIButton *btn = self.buttons[i];
        int curCnt = [[self.pressCountArray objectAtIndex:i] integerValue];

        [btn setTitle:[NSString stringWithFormat:@"%i",curCnt] forState:UIControlStateNormal];
    }
}

请注意,您需要检查是否已加载正确数量的数组元素。我在上面的代码中使用了NSAssert,但你可能需要返回NO,因为它可能会在生产中发生。