如何在NSUserDefaults中存储多个字典

时间:2016-06-01 10:51:34

标签: ios objective-c nsdictionary nsuserdefaults

我在FirstVC中有两个Viewcontrollers我构建5 UITextField进行注册,这个TextField值在字典中被最终存储在NSUserdefault中的字典然后在SecondVC中我希望​​显示这些数据 我的问题是,每当我在NSUserdefault中添加新的自由裁量权时,旧的字典被替换 我想要所有字典的数据。

下面是我的FirstVC的代码

  -(void)btnReg

{ 
//data add in disctionary
    for (int i=1; i<=5; i++)
    {
        UITextField *txtTemp=(UITextField *)[self.view viewWithTag:i];
        [discRege setObject:[NSNumber numberWithInt:count] forKey:@"no"];
        [discRege setObject:txtTemp.text forKey:[arraylblName objectAtIndex:i-1]];
    }
//dictionary add in nsuserdefault

    [[NSUserDefaults standardUserDefaults]setObject:discRege forKey:@"ABC"];
     [[NSUserDefaults standardUserDefaults]synchronize];

//push to SecondVc
    secondViewController *objSec=[[secondViewController alloc]init];
    [self.navigationController pushViewController:objSec animated:YES];
    [self.navigationController setNavigationBarHidden:false];

}

下面是我的SecondVC代码

ArratTemp  =[[NSUserDefaults standardUserDefaults]objectForKey:@"ABC"] ;
    if (!ArratTemp )
    {
        ArratTemp =[[NSMutableArray alloc]init];
    }
    else
    {
        ArratTemp = [[[NSUserDefaults standardUserDefaults]objectForKey:@"ABC"]mutableCopy];
    }
    NSLog(@"%@",ArratTemp);

2 个答案:

答案 0 :(得分:2)

每次使用相同的密钥并替换现有的字典对象时......

char

不是将其存储为字典,而是将其存储为字典数组。每当您添加新注册时,获取已保存的数组,将新的字典对象添加到其中并使用该数组更新userDefaults。

// Using the same key will overwrite the last saved dictionary.
[[NSUserDefaults standardUserDefaults] setObject:discRege forKey:@"ABC"];

希望它有所帮助。

答案 1 :(得分:0)

你每次都要覆盖同一部分。

您有两种解决方案:

解决方案1。

将不同的词典存储在不同的键下,而不是全部位于“ABC”下。因此,在您的for loop中,可以使用索引(i)来创建多个条目,而不是每次都使用ABC。在这里,你可以自己解决一个简单的问题。确保不要将所有内容存储在同一个Key下,然后你会找到它们;)例如,你可以保存在[NSNumber numberWithInt:i]下,然后浏览你的NSUserDefaults 0,1,2,3 ...等等。我建议不要这样做,解决方案2是要走的路。

解决方案2。

将所有词典存储在一个数组中,然后将该数组存储在NSUserDefaults中。

为此,只需创建一个保持为空的NSMutableArray,然后在其中添加词典!

NSMutableArray dataArray = [[NSMutableArray alloc]init];

for (int i=1; i<=5; i++)
    {
        //Creating new dictionary
        NSMutableDictionary *currentDict = [[NSMutableDictionary alloc]init];
        //Getting the text we want
        UITextField *txtTemp =(UITextField *)[self.view viewWithTag:i];
        NSString *text = txtTemp.text;

        //This is here because you had it
        [currentDict setObject:[NSNumber numberWithInt:count] forKey:@"no"];

        //All dictionaries will have key = name of the Label,
        //but you could change it to something static, like
        // "Content" for example. It'll be easier to find later
        [currentDict setObject:text forKey:[arraylblName objectAtIndex:i-1]];

        //Adding that newly formed dictionary to the mutable array.
        [dataArray addObject:currentDict];
    }

  //Adding the array containing dictionaries to the NSUSerDefaults
 [[NSUserDefaults standardUserDefaults]setObject:dataArray forKey:@"ABC"];

注意:我不完全确定你在for循环中对字典做了什么,但是由于你没有显示代码,我猜它'不是问题的一部分。根据我的回答,您有足够的信息可以在需要时进行一些更正。您需要记住的是:

  1. 为每个答案创建一个字典,而不是为所有
  2. 创建一个字典
  3. 将每个字典放在同一个数组中
  4. 保存数组(包含所有词典)