更新字典中的键

时间:2012-02-01 22:58:28

标签: iphone objective-c cocoa-touch

我在NSArray中有一些NSDictionaries。我想修改其中一个字典中的BOOL,以便整个数组将进行更改(它加载一个tableview)。

我有这段代码,但它不会改变BOOL。我觉得我需要删除mutableCopy才能正常工作,但随后崩溃......

    NSLog(@"before: %@", self.currentScopeArray);
    if (cell.accessoryType == UITableViewCellAccessoryNone) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [[self.currentScopeArray objectAtIndex:iIndexPath.row] setObject:[NSNumber numberWithBool:YES] forKey:@"enabledByDefault"];
    } else {    
        if (!(self.currentScopeArray.count < 2)) {
            cell.accessoryType = UITableViewCellAccessoryNone;
            [[[self.currentScopeArray objectAtIndex:iIndexPath.row]mutableCopy] setObject:[NSNumber numberWithBool:NO] forKey:@"enabledByDefault"];
        }
    }
    NSLog(@"after: %@", self.currentScopeArray);

2 个答案:

答案 0 :(得分:1)

如果您创建对象的可变副本,那么它就是一个副本。如果你想改变已经在currentScopeArray里面的对象,那么你需要在数组中拥有可变对象,或者你需要获得一个可变副本,改变它然后替换原始对象。

我建议前者说实话。因此,您可以通过向其添加currentScopeArray来创建NSMutableDictionary,然后只需替换此行:

[[[self.currentScopeArray objectAtIndex:iIndexPath.row]mutableCopy] setObject:[NSNumber numberWithBool:NO] forKey:@"enabledByDefault"];

用这个:

[[self.currentScopeArray objectAtIndex:iIndexPath.row] setObject:[NSNumber numberWithBool:NO] forKey:@"enabledByDefault"];

答案 1 :(得分:1)

您正在向NSArray添加一堆NSDictionary。我建议你

  • 将NSArray转换为NSMutableArray
  • 将NSDictionary设为NSMutableDictionary

为什么呢?因为您已经需要修改Dictionary中的值。并且,您可能想要从数组中添加/删除字典。一旦你使它们变得可变,你就可以这样做:

   [[self.currentScopeArray objectAtIndex:iIndexPath.row] setObject:[NSNumber numberWithBool:YES] forKey:@"enabledByDefault"];

[[self.currentScopeArray objectAtIndex:iIndexPath.row] setObject:[NSNumber numberWithBool:NO] forKey:@"enabledByDefault"];

使用当前实现的另一个问题是您在原始字典上运行可变副本。副本被修改,原件不是。