Ios 保存并加载NSMutableArray-NSUserDefaults

Ios 保存并加载NSMutableArray-NSUserDefaults,ios,objective-c,nsmutablearray,nsuserdefaults,Ios,Objective C,Nsmutablearray,Nsuserdefaults,我正在尝试将一个NSMutableArray保存到NSUserDefaults中,然后重新加载它并使用它填充按钮标签。有人能看一下并告诉我我做错了什么吗 当我将文件加载到新数组时,它显示为空。我试图设置标题的所有按钮都位于名为buttons的IBMCollectionOutlet中 -(void)save { [[NSUserDefaults standardUserDefaults] setObject:self.pressCountArray forKey:@"savedFile"]

我正在尝试将一个
NSMutableArray
保存到
NSUserDefaults
中,然后重新加载它并使用它填充按钮标签。有人能看一下并告诉我我做错了什么吗

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

-(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];
    }
}
-(作废)保存{
[[NSUserDefaults standardUserDefaults]设置对象:self.pressCountArray forKey:@“savedFile”];
[[NSUserDefaults standardUserDefaults]同步];
}
-(空)荷载{
NSMutableArray*countArray=[[NSUserDefaults standardUserDefaults]ArrayWorkey:@“savedFile”]mutableCopy];
用于(NSInteger i=0;i<[self.presscontarray count];i++){
self.pressCountArray[i]=countArray[i];
}
对于(NSInteger i=0;i<[self.buttons count];i++){
UIButton*btn=自身按钮[i];
int curCnt=[[self.presscontarray objectAtIndex:i]integerValue];
[btn setTitle:[NSString stringWithFormat:@“%i”,curCnt]用于状态:UIControlStateNormal];
}
}

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

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];

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

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];

看起来您没有分配
self。在加载过程中按CountArray
,可能正试图填充一个空数组(以一种相当奇怪的方式)。而是简单地做:

-(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];
    }
}
-(无效)加载{
self.pressCountArray=[[NSUserDefaults standardUserDefaults]数组工作:@“savedFile”]mutableCopy];
NSAssert([self.pressCountArray count]==[self.buttons count],@“数组计数不匹配”);
对于(NSInteger i=0;i<[self.buttons count];i++){
UIButton*btn=自身按钮[i];
int curCnt=[[self.presscontarray objectAtIndex:i]integerValue];
[btn setTitle:[NSString stringWithFormat:@“%i”,curCnt]用于状态:UIControlStateNormal];
}
}

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

看起来您没有分配
self。在加载过程中按CountArray
,可能正试图填充一个空数组(以一种相当奇怪的方式)。而是简单地做:

-(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];
    }
}
-(无效)加载{
self.pressCountArray=[[NSUserDefaults standardUserDefaults]数组工作:@“savedFile”]mutableCopy];
NSAssert([self.pressCountArray count]==[self.buttons count],@“数组计数不匹配”);
对于(NSInteger i=0;i<[self.buttons count];i++){
UIButton*btn=自身按钮[i];
int curCnt=[[self.presscontarray objectAtIndex:i]integerValue];
[btn setTitle:[NSString stringWithFormat:@“%i”,curCnt]用于状态:UIControlStateNormal];
}
}

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

在保存之前和之后放置断点或NSlog值,以了解发生了什么事pressCountArray是如何声明的以及如何设置其内容的?第一个循环应替换为`self.pressCountArray=[[NSUserDefaults standardUserDefaults]ArrayWorkey:@“saveFile”]mutableCopy];我会尝试在save方法中设置断点,并在调试器中打印[NSUserDefaults standardDefaults]的内容。您可以手动检查用户默认值,还是在这两种方法之前和之后打印出来?也许你会从中发现错误。当我在加载后使用断点时,PressCountArray为16个整数,介于1-3之间。我的PressCountArray为空?在保存之前和之后放置断点或NSlog值,以了解发生了什么情况PressCountArray是如何声明的以及如何设置其内容的?第一个循环应替换为`self.pressCountArray=[[NSUserDefaults standardUserDefaults]ArrayWorkey:@“saveFile”]mutableCopy];我会尝试在save方法中设置断点,并在调试器中打印[NSUserDefaults standardDefaults]的内容。您可以手动检查用户默认值,还是在这两种方法之前和之后打印出来?当我在加载后使用断点时,我的PressCountArray为空?如果这是真的,则会出现异常“尝试插入非属性列表对象”。因此,这不是答案。如果这是真的,将出现异常“尝试插入非属性列表对象”。因此,这不是答案。self.pressCountArray在仍然加载时为空,@burrgg OK,因此看起来数组没有存储在
NSUserDefaults
对象中。self.pressCountArray在仍然加载时为空,@burrgg OK,因此看起来数组没有存储在
NSUserDefaults
对象中。