2012-05-05 6 views
2

У меня возникли проблемы с сохранением NSMutableDictionary. Я пытаюсь сохранить его в NSUserDefaults, затем загрузите и измените синий цвет, а затем сохраните его снова.Установленное значение NSMutableDictionary?

Так что я сначала сделать это так:

NSMutableDictionary *d = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           firstNameLbl, @"firstName", 
           lastNameLbl, @"lastName", 
           nil]; 
    [[NSUserDefaults standardUserDefaults] setObject:d forKey:@"youDict"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

Тогда я загрузить его и попытаться изменить значение, как это:

NSMutableDictionary *d = [[NSUserDefaults standardUserDefaults] objectForKey:@"youDict"]; 
    [d setObject:textField.text forKey:key]; 
    [[NSUserDefaults standardUserDefaults] setObject:d forKey:@"youDict"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

Однако эта линия, [d setObject:textField.text forKey:key];, вызывает приложение аварии, и я получаю эту ошибку:

'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

Надеюсь, вы можете помочь мне исправить это, спасибо.

+0

кажется, что вы не можете сделать в этом случае, безусловно, NSUserDefaults возвращает неизменный __NSCFDictionary, поэтому может быть проблема при вызове '[d SetObject: textField.text forKey: ключ];'. – Mat

ответ

4

объектForKey возвращает неизменяемое значение для NSUserDefaults. Для того, чтобы сделать эту работу заменить первую строку 2-го блока кода с этим:

NSMutableDictionary *d = [NSMutableDictionary dictionaryWithDictionary: [[NSUserDefaults standardUserDefaults] objectForKey:@"youDict"]]; 
1

NSUserDefaults не различает между изменяемыми и неизменяемыми объектами, поэтому, когда вы получите его обратно, это будет неизменен:

Если вы хотите, изменяемый словарь, просто использовать mutableCopy:

NSMutableDictionary *d = [[[NSUserDefaults standardUserDefaults] objectForKey:@"youDict"] mutableCopy]; 

Надежда, это поможет вам ...

+1

SO необходимо установить ограничение на 15 минут, прежде чем разрешить кому-либо принимать ответ, чтобы уменьшить «первый ответ - всегда лучшая» проблема. –

+0

Конечно согласен с тобой ... Это единственный способ уменьшить ненужную итерацию и подобрать лучший ответ для переполнения стека. – Nit

1

Попробуйте с помощью этого кода я думаю, мы полезны для вас.

NSMutableDictionary *d = [NSMutableDictionary dictionaryWithDictionary: [[NSUserDefaults standardUserDefaults] ValueForKey:@"youDict"]]; 
Смежные вопросы