【问题标题】:Save and load NSMutableArray - NSUserDefaults保存和加载 NSMutableArray - NSUserDefaults
【发布时间】:2014-08-11 10:45:19
【问题描述】:

我正在尝试将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];
    }
}

【问题讨论】:

  • 放断点或者 NSlog 保存之前和之后的值,以了解发生了什么
  • pressCountArray 是如何声明的以及如何设置它的内容?第一个循环应替换为 `self.pressCountArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"saveFile"] mutableCopy];我会尝试在 save 方法中放置一个断点并在调试器中打印 [NSUserDefaults standardDefaults] 的内容。
  • 您可以手动检查您的用户默认设置或在这两种方法之前和之后将其打印出来吗?也许你会发现你的错误。
  • PressCountArray 为 16 个整数,介于 1-3 之间,当我在加载后使用断点时,我的 pressCountArray 为空?

标签: ios objective-c nsmutablearray nsuserdefaults


【解决方案1】:

我认为您的数组包含自定义对象。 如果是这种情况,那么您应该在您的自定义模型类中实现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];

【讨论】:

  • 如果是这样,就会出现异常“尝试插入非属性列表对象”。所以这不是答案。
【解决方案2】:

看起来您在加载期间没有分配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,因为它可能会在生产中发生。

【讨论】:

  • self.pressCountArray 加载时为空,
  • @burrGGG 好的,所以看起来数组没有存储在NSUserDefaults 对象中。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多