-2

I have an NSMutableArray. The array is storing NSMutableDictionary. The dictionary object is storing NSUserDefault values. These are slider values previously selected by user. Now I want that, when user move these sliders then new slider values must be saved in NSUserDefaults.

I'm using this method to add a value in the NSMutableArray

NSMutableArray *quarterValueArray = [[[NSUserDefaults standardUserDefaults]arrayForKey:@"QuarterValues"] mutableCopy];
if (!quarterValueArray)
{
    NSMutableArray *aQuarterArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 12; i++)
    {
         NSMutableDictionary *dict1 = [[[NSMutableDictionary alloc] init] mutableCopy];
        [dict1 setObject:@"" forKey:@"quarterP"];
        [dict1 setObject:@"" forKey:@"quartersliderValue"];
        [dict1 setObject:@"" forKey:@"totalOfTheQuater"];
        [aQuarterArray addObject:dict1];
    }
    [[NSUserDefaults standardUserDefaults] setObject:aQuarterArray forKey:@"QuarterValues"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

and then for storing slider values i am using this method in sliderviewCntroller

-(void)saveUserDefaultDataQuarter
{
    NSMutableDictionary *quarter = [QuarterValueArray objectAtIndex:0];
    [quarter setObject:totalQuarter1txt.text forKey:@"totalOfTheQuater"];
    [quarter setObject:showQuartertxt.text forKey:@"quarterP"];
    [quarter setObject:[NSString stringWithFormat:@"%d",(int)slider4.value]forKey:@"quartersliderValue"];
  }


QuarterValueArray =[[[NSUserDefaults standardUserDefaults]arrayForKey:@"QuarterValues"]mutableCopy];

Why this code is crashing when the method is called second time? The crash log says:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

rmaddy
  • 314,917
  • 42
  • 532
  • 579

1 Answers1

-2

Try this.

    NSMutableArray *quarterValueArray = [[[NSUserDefaults standardUserDefaults]arrayForKey:@"QuarterValues"] mutableCopy];
if (!quarterValueArray)
{
    NSMutableArray *aQuarterArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 12; i++)
    {
        NSMutableDictionary *dict1 = [[[NSMutableDictionary alloc] init] mutableCopy];
        [dict1 setObject:@"" forKey:@"quarterP"];
        [dict1 setObject:@"" forKey:@"quartersliderValue"];
        [dict1 setObject:@"" forKey:@"totalOfTheQuater"];
        [aQuarterArray addObject:dict1];
    }
    [[NSUserDefaults standardUserDefaults] setValue:aQuarterArray forKey:@"QuarterValues"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
[self saveUserDefaultDataQuarter];
NSLog(@"%@",quarterValueArray);

and modify like this.

-(void)saveUserDefaultDataQuarter{
NSMutableArray*QuarterValueArray =[[[NSUserDefaults standardUserDefaults]arrayForKey:@"QuarterValues"]mutableCopy];
NSMutableDictionary *quarter = [QuarterValueArray objectAtIndex:0];
[quarter setValue:totalQuarter1txt.text forKey:@"totalOfTheQuater"];
[quarter setValue:showQuartertxt.text forKey:@"quarterP"];
[quarter setValue:[NSString stringWithFormat:@"%d",(int)slider4.value]forKey:@"quartersliderValue"];                      }

UPDATE :I have used set value for setting the dictionary key values, as dictionary is already created when we are modifying values.

NewStackUser
  • 657
  • 5
  • 17