2016-06-01 3 views
3

에서 여러 사전을 저장하려면이 텍스트 필드의 값이 마지막으로 NSUserdefault에 저장된 사전이 다음 SecondVC에 내가이 데이터를 표시 할 사전에 stroed된다 내 문제가 있다는 것입니다 때마다 내가 임의의 것을 추가 할 때 NSUserdefault 이전의 사전이 바뀌었다 나는 모든 사전의 데이터를 원한다. 아래은 어떻게 등록 5 <code>UITextField</code>를 구축 내가 FirstVC 두 Viewcontrollers이 NSUserDefaults

-(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이 옳다. 다른 뷰 컨트롤러에 직접 데이터를 전달할 수있다. 아무 필요도 userdefaults를 사용하지 않아도된다 – Lion

+0

예 나는 그것을 알고있다. 그러나 나는 단지 내가 그것을 사용하는 이유 인 Nsuserdefault를 배우고 싶다. .. – Priya

답변

2

같은 키를 사용하여 교체 할 때마다의 코드가 내 FirstVC의 코드는 기존의 사전 객체 ...

// 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

그게 내가 무엇을 고마워하고 싶은지 고마워. 대답 : ...... – Priya

0

매번 같은 주제에 겹쳐 쓰고 있습니다.

해결 방법 1.

모든 "ABC"에서 다른 키에서 저장 다른 사전 :

당신은 두 가지 솔루션이있다. 따라서 귀하의 for loop은 매번 ABC가 아닌 여러 항목을 갖기 위해 색인 (i)을 사용할 수 있습니다. 여기 당신이 해결할 수있는 간단한 문제입니다. 예를 들어, [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"]; 

참고 : 당신이 for 루프에서 사전에 무슨 일을하는지 정확히 모르겠지만, 당신이 코드를 표시하지 않았기 때문에, 나는 문제의 그 '일부가 아닌 같은데요. 제 대답으로 필요한 경우 약간의 수정을 할 수있는 충분한 정보가 있습니다.당신이 기억 할 필요가있다 :

  1. 는 같은 배열
  2. 저장 (모든 사전을 포함) 배열
각 사전을 넣어 모든
  • 에 대한 하나의 대답에 따라 사전 만들기, 그리고
  • +0

    고마워. 당신의 두번째 해결책 그러나 지금 문제는 동일한 사전을 많은 시간을 추가하고 나는 다른 사전 ................을 원할 때 나가 그것을 포함하는 사전 첫번째 시간 배열을 추가 할 때 의미하고 추가 할 때 두 번째 사전 배열은 동일한 (lastone) 사전을 두 번 포함하지만 첫 번째 사전은 엉덩이 두 번째 사전을 저장하려고합니다. – Priya

    +0

    답변에서 내 코드를 확인하십시오. 매번 새로운 사전을 만들겠습니까? Notice 'discRege'를 사용하지 않았고, 대신'currentDic †'을 만들었습니다. 매번 생성되는 새로운 객체입니다 ** ** 루프 내부에 있습니다. 그곳에서 생성되고 **에 nsuserdefaults **가 아닌 **를 추가하면 잘 될 것입니다. 루프 끝에서만 ** 사전 (nsuserdefault **)에 배열을 추가합니다 ** –