我在更新嵌套结构中的对象时遇到问题。我有一个
NSMutableDictionary
包含多个nsmutableDictionaries,在另一种情况下,上一级别的每个都有一个额外级别的nsmutableDictionaries。
这些是可变类型所以我假设只是setObject:ForKey:将正常工作。出于某种原因,当嵌套结构时,任何更新单个内部级别字典的尝试,它都会覆盖此级别的所有字典值。
我已经尝试了很多东西,从解析出值并尝试重新插入,去除密钥的对象,但似乎没有任何效果。
任何帮助将不胜感激。
这是我的代码: 我有一个textfield和segmentedControl设置,有几个索引来演示,选择哪个是它用来保存/更新对象的索引。我使用NSNumber作为键。
更新
//viewDidLoad
self.content = [NSMutableDictionary new];
self.contentContainer = [NSMutableDictionary new];
- (IBAction)like_unlike:(id)sender {
BOOL isLiked = [self.textField.text boolValue];
NSLog(@"isLiked - %d", isLiked ? YES : NO);
NSNumber *nsIsLiked = [NSNumber numberWithBool:isLiked];
NSLog(@"nsIsLiked - %@", nsIsLiked);
[self.content setObject:nsIsLiked forKey:@"updatedIsLiked"];
[self.contentContainer setObject:self.content forKey:[NSNumber numberWithInteger:self.segment.selectedSegmentIndex]];
}
NSLog(@"COMPLETE DIC - %@", self.contentContainer);
}
这是输出。我保存了3个值。索引0,2和4。
2014-11-08 11:45:41.855 DictionariesNested[1039:125297] isLiked - 1
2014-11-08 11:45:41.855 DictionariesNested[1039:125297] nsIsLiked - 1
2014-11-08 11:45:41.855 DictionariesNested[1039:125297] COMPLETE DIC - {
0 = {
updatedIsLiked = 1;
};
}
2014-11-08 11:45:43.623 DictionariesNested[1039:125297] isLiked - 1
2014-11-08 11:45:43.623 DictionariesNested[1039:125297] nsIsLiked - 1
2014-11-08 11:45:43.623 DictionariesNested[1039:125297] COMPLETE DIC - {
0 = {
updatedIsLiked = 1;
};
2 = {
updatedIsLiked = 1;
};
}
2014-11-08 11:45:45.018 DictionariesNested[1039:125297] isLiked - 1
2014-11-08 11:45:45.018 DictionariesNested[1039:125297] nsIsLiked - 1
2014-11-08 11:45:45.018 DictionariesNested[1039:125297] COMPLETE DIC - {
0 = {
updatedIsLiked = 1;
};
4 = {
updatedIsLiked = 1;
};
2 = {
updatedIsLiked = 1;
};
}
然后,在将索引0更新为false时,所有值都将更改为0.
2014-11-08 11:48:01.161 DictionariesNested[1188:161731] isLiked - 0
2014-11-08 11:48:01.161 DictionariesNested[1188:161731] nsIsLiked - 0
2014-11-08 11:48:01.162 DictionariesNested[1188:161731] COMPLETE DIC - {
0 = {
updatedIsLiked = 0;
};
4 = {
updatedIsLiked = 0;
};
2 = {
updatedIsLiked = 0;
};
}
答案 0 :(得分:0)
编辑:我更新你的问题后重写了我的答案
当您执行self.contentContainer setObject:
时,您每次都会存储相同的词典,而不是所选段的特定词典。所以,如果你改变一个,所有都会改变,因为它是同一个实例。为了为每个段创建一个字典,如果它尚不存在,则必须实例化一个新字典。
为了解决您的问题,您必须为每个细分实例化一个NSMutableDictionary
。这样的事情应该有效:
NSMutableDictionary *content = [self.contentContainer objectForKey:self.segment.selectedSegmentIndex];
if (!content) {
content = [[NSMutableDictionary alloc] init];
[content setObject:nsIsLiked forKey:@"updatedIsLiked"];
}
[self.contentContainer setObject:content forKey:[NSNumber numberWithInteger:self.segment.selectedSegmentIndex]];