无法更新嵌套的NSMutableDictionary - 更新错误的密钥

时间:2014-11-07 15:20:42

标签: ios nested nsmutabledictionary

我在更新嵌套结构中的对象时遇到问题。我有一个

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;
};
}

1 个答案:

答案 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]];