2014-03-01 4 views
0

내가 '날짜'=> '값'NSMutableDictionary 및 NSUserDefaults

는 각 시간을 절약해야하기 때문에 내가, NSMutableDictionary를 사용하려고 해요의 키 값을 저장하기 위해 적절한 데이터 구조를 알아 내기 위해 노력하고있어 사용자가 값을 입력하고 '저장'을 누릅니다.

그러나 NSLog를 사용하려고하면 사전의 값은 항상 null입니다.

- (IBAction)saveWeight:(id)sender 
{ 
    NSMutableDictionary *weightLog = [[NSMutableDictionary alloc] init]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

    NSString *date = @"12/12/14"; 

    [weightLog setObject:self.weightInput.text forKey:date]; 

    NSLog(@"neweight you entered is %@", self.weightInput.text); 
    NSLog(@"weightlog is %@", weightLog); 

    [userDefaults setObject:weightLog forKey:@"Weightlog"]; 
    [userDefaults synchronize]; 
} 

로그 출력 : 호출

diet[35744:70b] neweight you entered is 13 
2014-03-01 16:25:58.712 diet[35744:70b] weightlog is { 
"12/12" = 13; 
} 
+0

하여 인쇄 해보십시오 [weightLog objectForKey : "yourkey"@]와 무엇을보고 이게 실제 코드입니까 –

+1

입니까? 로그 텍스트를 표시하십시오. – Wain

+0

예, 이것이 제 실제 코드입니다. 얼마나 많은 값을 입력했는지에 상관없이 마지막 값만 인쇄됩니다. 로그 출력으로 편집 됨. – TerryG

답변

2

물론 마지막 valeur 만 저장됩니다. 새 것을 추가하기 전에 weightLog의 이전 값! 또한 한 가지 더, 각 값에 대한 키를 변경해야합니다.

봅니다 (두 번째 해 + 월 + 일 + 시간 + 분 + 포함됩니다 날짜, 그래서 두 번째 ;-D 1 회 이상 클릭하지 마십시오)이 사용하기 :

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

NSMutableDictionary *weightLog = [NSMutableDictionary dictionaryWithDictionary:[userDefaults objectForKey:@"Weightlog"]]; 


NSString *date = [NSDateFormatter localizedStringFromDate:[NSDate date] 
               dateStyle:NSDateFormatterShortStyle 
               timeStyle:NSDateFormatterFullStyle]; 

[weightLog setObject:self.weightInput.text forKey:date]; 

NSLog(@"neweight you entered is %@", self.weightInput.text); 
NSLog(@"weightlog is %@", weightLog); 

[userDefaults setObject:weightLog forKey:@"Weightlog"]; 
[userDefaults synchronize]; 
2

:

NSMutableDictionary *weightLog = [[NSMutableDictionary alloc] init]; 

완전히 이전에 사용자의 기본 설정에 저장된 수있는 것을 무시하고 비어있는 새 사전을 생성합니다. 당신이해야 할 것은 :

NSMutableDictionary *weightLog = [[userDefaults objectForKey:@"Weightlog"] mutableCopy]; 

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

지금 weightLog가 변경 가능한 형태로 기존 내용, 또는 비어있는 새 변경 가능한 사전 중 하나입니다.

항상 사전에 동일한 키를 추가하면 이전 키가 대체됩니다. 따라서 현재 코드에서 키 (date)가 하드 코딩되었으므로 사전에 항목 1 개만 가져옵니다. ...

+0

자, 여기서 최종 목표는 각 날짜의 체중이 1 인 '날짜'에 사용자의 가중치 변수를 연결하는 것입니다. 열쇠를 현재 날짜로 설정하면 효과가 있습니다. 맞습니까? 그러면 나는 그들을 반복하여 올바르게 표시 할 수 있어야합니까? – TerryG

+0

예, 오늘의 날짜를 사전의 키로 만들면됩니다. 그런 다음 매일 해당 날짜에 이전에 덮어 쓰 겠지만 전체적으로는 기록 된 모든 요일에 대해 세트를 갖게됩니다. – Wain

1

이 다른 위의 두 가지 대답은 훌륭하고 설계상의 몇 가지 결점/오해를 지적합니다. 항상 한 사전만으로 새로운 사전으로 교체됩니다. 예를 들어, 해결할 때마다 마지막 값을 무시할 것입니다. 'object : forKey :'를 설정하고 항상 동일한 키를 다시 사용합니다 ...

값을 변경할 수있는 배열은 동적 인 growi ng 목록 .. 또한 NSNumber는 컬렉션 (즉, NSArray, NSDictionary, NSSet) 문자열을 값으로 하드 코딩하는 것보다 훨씬 유연하고 강력하며 적절한 객체 유형입니다. 당신의 NSNumber에 산술 연산을 수행 할 수 비교는뿐만 아니라 당신은 ... 다른 지역화에 대한 등 킬로그램 파운드로 변환 할 수 있습니다 등

행운을 빕니다 :)