当我将setObject设置为NSMutableDictionary时,添加的先前对象将被删除

时间:2014-09-17 22:24:29

标签: objective-c ios7 nsmutabledictionary

这是将对象添加到NSMutableDictionary的代码:

-(void)mapUserFields: (UIControl *) sender  {

nsd = [[NSMutableDictionary alloc]init];

int tagValue = sender.tag;
UITextField *field  = [sender viewWithTag: tagValue];

[nsd setObject:field.text forKey:[NSString stringWithFormat:@"%d", tagValue]];

NSLog(@"\nfield.text: %@  tagValue: %d  nsd.count: %d\n",field.text, tagValue, nsd.count);
}

这是调试器控制台的输出:

2014-09-17 15:18:10.022 Books[20738:60b] 
field.text: 2  tagValue: 0  nsd.count: 1
2014-09-17 15:18:11.394 Books[20738:60b] 
field.text: 4  tagValue: 1  nsd.count: 1
2014-09-17 15:18:16.918 Books[20738:60b] 
field.text: 6  tagValue: 2  nsd.count: 1
2014-09-17 15:18:18.863 Books[20738:60b] dictionary.count: 1

如您所见,计数保持为1,但数据有效。有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:0)

如上面Josh所示,这一行是你的问题:

nsd = [[NSMutableDictionary alloc]init];

因为它用新的字典替换整个字典。因此,添加一个密钥并不是要删除另一个密钥,而是您明确地抛弃了之前的数据。

也许试试:

if (nds == nil) {
    nsd = [[NSMutableDictionary alloc]init];
}

答案 1 :(得分:0)

您已声明NSMutableDictionary' nsd'在全局范围内,每当某个控件事件被触发时,您都会分配内存并初始化字典。每次都可以初始化它,而不是在视图控制器的viewDidLoad方法中初始化它。

- (void)viewDidLoad
{
   [super viewDidLoad];
   nsd = [[NSMutableDictionary alloc]init]; 
}

然后在你的方法中将对象添加到字典

- (void)mapUserFields:(UIControl *) sender
{
    int tagValue = sender.tag;
    UITextField *field  = [sender viewWithTag: tagValue];

   [nsd setObject:field.text forKey:[NSString stringWithFormat:@"%d", tagValue]];

   NSLog(@"\nfield.text: %@  tagValue: %d  nsd.count: %d\n",field.text, tagValue,                        nsd.count);
}