2010-12-01 13 views
0

내 NSUserdefaults에 문제가 있습니다. 텍스트 상자에 이름을 입력하고 최고 점수를 클릭하면 응용 프로그램에서 아무런 반응이 없으며 키패드가 화면에 계속 표시됩니다. 데이터를로드하려고하면 name 데이터가 nil이라고 표시됩니다. 내가 가지고있는 점수는 90입니다. 누군가 제 코딩에 어떤 문제가 있는지 말해주십시오.데이터가 NSUserDefaults에 저장되지 않습니다.

감사합니다.

-(IBAction)savehighscore_button { 


    int i, ii = -1; 

    struct high_score { 
     NSString *name; 
     int highScore; 
    }; 

    struct high_score structArray[10]; 

    NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults]; 

    for (i=0; i<10; i++) { 

     if ([userPreferences stringForKey :[NSString stringWithFormat:@"highScoreNameEntry%d",i]]!=nil && [userPreferences stringForKey :[NSString stringWithFormat:@"highScoreEntry%d"]]!=nil) { 
     structArray[i].name= [userPreferences stringForKey:[NSString stringWithFormat:@"highScoreNameEntry%d",i]]; 
      structArray[i].highScore = [userPreferences integerForKey:[NSString stringWithFormat:@"highScoreEntry%d",i]]; 
      ii = i; 
     } 
    } 
    if (myScore >0) { 
     for (i==ii; i>=0; i--) { 
      if (myScore > structArray[i].highScore) { 
       if (i<9) { 
        structArray[i+1] = structArray[i]; 
        structArray[i].name = nametextbox.text; 
        structArray[i].highScore = myScore; 

        if (i==ii && i<9) { 
         structArray[i+1].name = nametextbox.text; 
         structArray[i+1].highScore = myScore; 
         ii=i+i; 
        } 

        else if(i==ii && i<9) { 
         structArray[i+1].name = nametextbox.text; 
         structArray[i+1].highScore = myScore; 
         ii=i+1; 
        } 
       } 
      } 

      if (ii==-1 && myScore >0) { 
       structArray[0].name = nametextbox.text; 
       structArray[0].highScore = myScore; 
       ii=0; 
      } 
      for (i=0; i<=ii; i++) { 
       [userPreferences setObject:structArray[i].name forKey:[NSString stringWithFormat:@"highScoreNameEntry%d",i]]; 
       [userPreferences setInteger:structArray[i].highScore forKey:[NSString stringWithFormat:@"highScoreEntry%d",i]]; 
      } 
     } 
    } 

} 
+0

하이 칼, 유 편집하는 부분을 알 수 있습니다. – lol

+1

그는 깨진 코드 서식을 수정했습니다. – vikingosegundo

+1

이것은 http://stackoverflow.com/questions/4320756/nsuserdefauls-problem/4320827 –

답변

3

아무것도가 standard PLIST-compliant class (NSArray를,있는 NSDictionary,의 NSNumber,있는 NSString,있는 NSDate,을 NSData, NSValue)이어야합니다. 그 중 하나가 아닌 경우 NSData 인스턴스로 보관해야하며 호환 가능하면 NSValue에 압축해야합니다.

즉, 당신은 자신이 필요로하는 것보다 훨씬 어려워졌습니다. 이름 (NSString)과 점수 (NSNumber)가 들어있는 사전 (각 점수가 높은 설명 자임)의 배열 (최고 점수 기술자 컨테이너)을 사용하지 않는 이유는 무엇입니까? 각 사전은 주어진 이름에 대해 높은 점수를 나타냅니다. 그런 다음 -setObject:yourArray forKey:@"HighScores"을 사용하여 전체를 저장할 수 있습니다.

NSUserDefaults에서만 변경 불가능한 사본을 얻을 수 있기 때문에 수정할 필요가있을 때 높은 점수 배열의 -mutableCopy를 요청해야합니다 (릴리스하지 마십시오). 점수를 바꾸거나 삭제/추가하십시오.

이 접근법을 사용하면 무시 무시한 숫자의 "문자열 #"접근 방식에 의지 할 필요가 없습니다. 배열에는 기존의 높은 점수 만 포함됩니다. 낭비가없고 100 % 표준 코코아 수업이 있으며 추가 작업없이 완전히 PLIST'able입니다. 또한 정렬 설명자를 사용하여 배열을 쉽게 정렬 할 수 있습니다 (사전에 점수 번호를 저장하는 데 사용한 키로 정렬 됨).

몇 가지 기본 코드 :

/* Build a fake high scores array */ 

NSMutableArray * highScores = [NSMutableArray array]; 

// Bob's score 
NSDictionary * bob = [NSDictionary dictionaryWithObjectsAndKeys: 
     @"Bob", @"name", 
     [NSNumber numberWithInt:8234323], @"score", 
     nil]; 
[highScores addObject:bob]; 

// Jane's score 
NSDictionary * jane = [NSDictionary dictionaryWithObjectsAndKeys: 
     @"Jane", @"name", 
     [NSNumber numberWithInt:92346345], @"score", 
     nil]; 
[highScores addObject:jane]; 

// Donald's score 
NSDictionary * donald = [NSDictionary dictionaryWithObjectsAndKeys: 
     @"Donald", @"name", 
     [NSNumber numberWithInt:5272348], @"score", 
     nil]; 
[highScores addObject:donald]; 

// Sort by high score 
NSSortDescriptor * sort = [[NSSortDescriptor alloc] initWithKey:@"score" 
                 ascending:NO]; 
[highScores sortUsingDescriptors:[NSArray arrayWithObject:sort]]; 
[sort release]; 

// Store in user defaults 
[[NSUserDefaults standardUserDefaults] setObject:highScores 
              forKey:@"HighScores"]; 
+0

감사합니다. 참조로 사용할 수있는 위의 방법을 사용하는 웹 사이트가 있습니까? 나는이 프로그래밍 언어에 익숙하지 않아서 미안하다. – lol

+0

첫 문장에서 제가 제공 한 링크는 어떻습니까? 그 외에도 구체적인 질문을해야합니다. 나는 당신이 찾고있는 것을 정확히하기위한 가이드를 모른다. 당신의 구글 검색은 나의 것과 같다. –

+0

첫 번째 문장의 링크는 저에게 게시되었습니다. 따라서 코딩에는 여전히 동일한 오류가 있습니다. 링크에서 제공된 도움말을 사용한 후에 데이터가 저장되지 않는다는 것을 알아 냈으므로 – lol

0

그나마 사용하는 것을 잊지 : 사용자의 기본 설정에 저장

[userPreferences synchronize]; 
관련 문제