2015-10-29 3 views
0

У меня есть NSMutableDictionary, в который я хочу изменить значение элемента.Изменить значение во вложенном NSMutableDictionary

//My dictionary: 

{ 
    objectId = 8ED998yWd1; 
    cardInfo =  { 
     state = published; //THIS! 
     price = 40; 
     color = red; 
     } 
}; 

Я попытался несколько способов, но значение не меняется, как это:

[dictionary setObject:@"reserved" forKey:@"state"]; //nope 

или это:

[dictionary setValue:@"reserved" forKeyPath:@"cardInfo.state"]; //nope 

или что:

[[dictionary objectForKey:@"cardInfo"] setObject:@"reserved" forKey:@"state"]; //no 

и это:

[dictionary setObject:@"reserved" forKey:[[dictionary objectForKey:@"cardInfo"] objectForKey:@"state"]]; 

Как я могу изменить объект «состояние» с «опубликовано» на «зарезервировано»?

Спасибо!

+0

Как это 'NSMutableDictionary' генерируется? JSON? Рукой? –

+0

Является ли внутренний словарь 'cardInfo' также изменчивым словарем? –

+0

Я беру файл у JSON. Я нашел проблему, в предыдущем словаре контроллера не изменялось. Сожалею. – Vins

ответ

1

Предполагая, что оба dictionary и cardInfo являются NSDictionary экземплярами:

Вы можете получить изменяемую копию вложенного словаря, изменить соответствующее значение и записать измененный словарь обратно в словарь «верхний уровень», как и :

NSMutableDictionary *mutableDict = [dictionary mutableCopy]; 
NSMutableDictionary *innerDict = [dictionary[@"cardInfo"] mutableCopy]; 
innerDict[@"state"] = @"reserved"; 
mutableDict[@"cardInfo"] = innerDict; 
dictionary = [mutableDict copy]; 

Я думаю, вы могли бы отжимают, что в одной строке, но это будет одна некрасиво линия.

Edit:

Если и внешний и внутренний словарь уже mutable, что бы упростить вещи немного, конечно:

NSMutableDictionary *innerDict = dictionary[@"cardInfo"]; 
innerDict[@"state"] = @"reserved"; 
dictionary[@"cardInfo"] = innerDict; 
+1

В вашем последнем фрагменте кода нет причин переназначать 'innerDict'. Фактически, если все это уже состоит из изменяемых словарей, вы можете просто сделать словарь [@ "cardInfo"] [@ "state"] = @ "reserved"; '. – rmaddy

+0

Вы, конечно, правы :) – Gamma

+0

Спасибо, но у меня всегда один и тот же тип журнала "[__NSDictionaryI setObject: forKeyedSubscript:]: нераспознанный селектор отправлен в экземпляр 0x7f96f947b9c0" – Vins

Смежные вопросы