我正在尝试将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];
}
}
答案 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
,因为它可能会在生产中发生。