字典值更改的数组反映在所有值中

时间:2018-02-10 13:09:47

标签: ios objective-c nsmutablearray nsmutabledictionary

我有NSMutableArray并添加了NSMutableDictionary

如果我为特定行更新一个值,则NSMutableDictionary中的所有值都会更改。

NSIndexPath *qtyIndex

-(void)demoDefaultCartValues{

    [dict_CartItems setValue:@"Item 1 KK Demo" forKey:@"DIC_PRODUCT_NAME"];
    [dict_CartItems setValue:@" KK Demo" forKey:@"SELLER_NAME"];
    [dict_CartItems setValue:@"1" forKey:@"QTY_VALUE"];
    [dict_CartItems setValue:@"42" forKey:@"SIZE_VALUE"];
    [dict_CartItems setValue:@"1250" forKey:@"PRICE_VALUE"];
    [dict_CartItems setValue:@"1500" forKey:@"DISCOUNT_VALUE"];

    for (int i = 0; i <= 5; i++) {
        [cartListArray addObject:dict_CartItems];
    }

}

#pragma mark - DropDown Delegate

    -(void)dropDownView:(UIView *)ddView AtIndex:(NSInteger)selectedIndex{

        [[cartListArray objectAtIndex:qtyIndexPath.row] setValue:[sizeArrayList objectAtIndex:selectedIndex] forKey:@"QTY_VALUE"];

        NSLog(@"What %@",cartListArray);
    }

如果我将qty 1更新为5,则所有字典值QTY_Value都会更改为5.

3 个答案:

答案 0 :(得分:1)

问题是你的代码使用相同的字典并且它是一个参考值,因此它是同一个字典的浅层副本,你可以在每次迭代时创建一个新的

 -(void)demoDefaultCartValues{


     for (int i = 0; i <= 5; i++) {

      NSMutableDictionary*dict_CartItems = [ NSMutableDictionary new];
      [dict_CartItems setValue:@"Item 1 KK Demo" forKey:@"DIC_PRODUCT_NAME"];
      [dict_CartItems setValue:@" KK Demo" forKey:@"SELLER_NAME"];
      [dict_CartItems setValue:@"1" forKey:@"QTY_VALUE"];
      [dict_CartItems setValue:@"42" forKey:@"SIZE_VALUE"];
      [dict_CartItems setValue:@"1250" forKey:@"PRICE_VALUE"];
      [dict_CartItems setValue:@"1500" forKey:@"DISCOUNT_VALUE"];

       [cartListArray addObject:dict_CartItems];
     }

  }

或者您可以使用copy / mutableCopy

   for (int i = 0; i <= 5; i++) {
       [cartListArray addObject:[dict_CartItems mutableCopy]];
     }

答案 1 :(得分:1)

这很明显

当您向数组添加NSMutableDictionary时,数组中包含该字典的引用。

现在你正在做的是在数组中多次插入相同的字典。所以当您更改数组中的单个对象时。所有的地方都受到影响。保持字典的相同对象总是会导致此问题。

此问题的解决方案是每次在插入数组之前创建一个新对象。

希望对你有帮助

答案 2 :(得分:1)

使用新的Objective-C功能(超过5年)使其更具可读性。并在数组中添加六个不同的可变字典:

NSDictionary* dict = { @"DIC_PRODUCT_NAME":@"Item 1 KK Demo",
                       @"SELLER_NAME":@" KK Demo",
                       @"QTY_VALUE": @"1",
                       etc.
                      };

for (NSInteger i = 0; i < 6; ++i)
    [cartListArray addObject: [dict mutableCopy]];

以后:

-(void)dropDownView:(UIView *)ddView atIndex:(NSInteger)selectedIndex{

    cartListArray [qtyIndexPath.row] [@"QTY_VALUE] = sizeArrayList [selectedIndex];
}

cartListArray应声明为

NSMutableArray <NSMutableDictionary*> *cartListArray;

现在我真的建议您根本不存储字典,但声明一个模型类。因此,您不必使用字符串作为数量等但NSInteger。如果你不想在初始化之后修改它,那么cartListArray也是不可变的。尽可能保持不变。