2016-06-01 3 views
3

У меня есть два Viewcontrollers в FirstVC я построить 5 UITextField для регистрации, это значение TextField являются stroed в словаре наконец словаре хранится в NSUserdefault затем в SecondVC я хочу, чтобы показать эти данные Моя проблема заключается в том, что каждый раз, когда я добавляю новое дискреционное значение в NSUserdefault. Старый словарь был заменен Мне нужны данные всего словаря.Как хранить несколько словаря в NSUserDefaults

ниже код моего 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); 
+1

По сути, это довольно плохая привычка программирования использовать пользовательские значения по умолчанию для передачи данных между контроллерами представлений. – vadian

+0

Да, @vadian прав, вы можете напрямую передавать данные в другие viewcontrollers. нет необходимости использовать userdefaults – Lion

+0

да, я знаю это, но я просто хочу узнать Nsuserdefault, поэтому я его использую .. – Priya

ответ

2

Каждый раз, когда вы используете тот же ключ и заменить существующий словарь объект ...

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

Вместо того чтобы хранить его в качестве словаря, храните его в виде массива словарей. Всякий раз, когда вы добавляете новую регистрацию, извлекаете сохраненный массив, добавляете в него новый объект словаря и обновляете userDefaults этим массивом.

mutableArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"ABC"] mutableCopy]; 
[mutableArray addObject:discReg]; 
[[NSUserDefaults standardUserDefaults] setObject:mutableArraay forKey:@"ABC"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

Надеюсь, это поможет.

+0

Thats What i want Спасибо за этот ответ ...... :) – Priya

0

Вы каждый раз переписываете один и тот же канал.

У вас есть два решения:

Решение 1.

хранить различные словари под разными ключами, не все под "ABC". Поэтому в вашем for loop можно использовать индекс (i), чтобы иметь несколько записей, а не просто ABC каждый раз. Здесь вы можете решить проблему самостоятельно. Не забудьте сохранить все под одним и тем же ключом, и вы их найдете;) Например, вы можете сохранить его под [NSNumber numberWithInt:i], а затем просмотреть NSUserDefaults для 0, 1, 2, 3 ... и так далее. Я рекомендую против этого btw, решение 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"]; 

Примечание: Я не совсем уверен, что вы делаете с словарями для цикла, но так как вы не показать код, я предполагаю, что его не часть вопроса. С моим ответом у вас достаточно информации, чтобы внести некоторые исправления, если это необходимо.Все, что нужно помнить:

  1. Создание словаря в ответ, и не один для всех
  2. Put каждый словарь в том же массиве
  3. Сохранить массив (содержащий все словари)
+0

Спасибо за ответ .. я использую ваше второе решение, но теперь проблема заключается в том, что он будет добавлять один и тот же словарь много раз, и я хочу, чтобы другой словарь ................ означает, когда я добавляю словарь первого массива времени, содержащего его, и когда я добавляю второй словарь содержит один и тот же (последний) словарь 2 раза, но я хочу сохранить 1-й словарь, а второй второй словарь – Priya

+0

Проверьте мой код в ответе. Вы уверены, что каждый раз создаете новый словарь? Заметьте, что я не использовал ваш 'discRege', я создал вместо него' currentDic †'. Это новый объект, созданный каждый раз, ** внутри ** цикла. Если он создан и добавлен ** к массиву, а не к nsuserdefaults **, все будет в порядке. Только в конце цикла вы добавите массив (а не словарь) в nsuserdefault ** –

Смежные вопросы