Сохранить и загрузить 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]; } } 

Я думаю, что ваш массив содержит пользовательские объекты. Если это так, тогда вы должны внедрить протокол 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]; 

Похоже, вы не выделяете 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 поскольку это, вероятно, то, что может произойти в производстве.