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

ハイテクカール、私はuが編集したどの部分を知っていることがあります。 – lol

+1

彼は壊れたコードフォーマットを修正しました – vikingosegundo

+1

これはhttp://stackoverflow.com/questions/4320756/nsuserdefauls-problem/4320827 –

答えて

3

ものはstandard PLIST-compliant class(NSArrayの、NSDictionaryの、のNSNumber、NSStringの、NSDate、NSDataの、NSValue)でなければなりません。それが1つでもない場合は、NSDataインスタンスとしてアーカイブする必要があり(したがってNSCodingに準拠する必要があります)、互換性がある場合はNSValueにパックする必要があります。

これは、あなたが必要とするよりもはるかに難しいことだと言いました。名前(NSString)とスコア(NSNumber)を保持する辞書(高スコアの記述子)を辞書(高スコア記述子コンテナ)に持たないのはなぜですか?各ディクショナリは、特定の名前のハイスコアを表します。その後、-setObject:yourArray forKey:@"HighScores"を使用して全体を格納することができます。

NSUserDefaultsからの不変のコピーのみが戻ってくるので、修正したいときに高スコア配列の-mutableCopy(リリースすることを忘れないでください)を求めてください。スコアを置き換えるか、削除/追加します。

非常に "ストリング#"のアプローチで、固定数のスコアで解決する必要はありません。配列には、既存の高得点のみが含まれます。余分な作業がなく完全にPLIST可能な100%標準ココアクラスと無駄はありません。これにより、並べ替え記述子(辞書にスコア番号を格納するために使用したキーでソートされた)を使用して配列を簡単にソートすることもできます。

いくつかの基本的なコード:

/* 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]; 
関連する問題