我有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.
答案 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也是不可变的。尽可能保持不变。