2010-12-01 4 views
0

J'ai un problème avec mon NSUserdefaults. Quand je tape le nom dans la zone de texte et que je clique sur le highscore, l'application ne répondra plus et le clavier sera toujours à l'écran. Quand j'ai essayé de charger les données, on dit que les données pour le nom sont nulles. Le score que j'ai est de 90. Quelqu'un peut-il me dire ce qui ne va pas avec mon codage?Les données ne sont pas enregistrées dans NSUserDefaults

Un grand merci.

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

salut carl, puis-je savoir quelle partie u modifié. – lol

+1

il a fixé votre format de code brisé ur – vikingosegundo

+1

Ceci est un doublon de http://stackoverflow.com/questions/4320756/nsuserdefauls-problem/4320827 –

Répondre

3

Tout enregistrées dans les valeurs par défaut de l'utilisateur doit être d'un standard PLIST-compliant class (NSArray, NSDictionary, NSNumber, NSString, NSDate, NSData, NSValue). Si ce n'est pas le cas, il doit être archivé en tant qu'instance NSData (et donc être compatible avec NSCoding) ou être inclus dans un NSValue s'il est compatible. Cela dit, vous vous rendez beaucoup plus difficile sur vous-même que nécessaire. Pourquoi ne pas avoir un tableau (le conteneur du descripteur de score élevé) des dictionnaires (chacun est un descripteur pour un score élevé) qui contient un nom (un NSString) et le score (un NSNumber)? Chaque dictionnaire décrit un score élevé pour un prénom. Vous pouvez ensuite stocker le tout en utilisant -setObject:yourArray forKey:@"HighScores". Comme vous ne récupérez que des copies immuables de NSUserDefaults, vous devrez demander une copie -mutableCopy du tableau des scores les plus élevés (n'oubliez pas de le libérer) lorsque vous voulez modifier des choses. Remplacez une partition ou supprimez/ajoutez. En utilisant cette approche, vous n'avez pas besoin de recourir à l'approche ghastly "chaîne #" avec un nombre de partitions fixe. Votre tableau contiendra uniquement les meilleurs scores existants. Pas de déchets et toutes les classes de cacao 100% standard qui sont entièrement PLIST'able sans travail supplémentaire. Cela vous permet également de trier facilement le tableau en utilisant des descripteurs de tri (triés par la clé que vous avez utilisée pour stocker le numéro de partition dans le dictionnaire).

Certains code de base:

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

merci, avez-vous un site Web avec la méthode ci-dessus que je peux utiliser comme référence. Je suis désolé parce que je suis nouveau dans ce langage de programmation. – lol

+0

Que diriez-vous du lien que j'ai fourni dans la première phrase? Au-delà, vous devrez poser des questions plus spécifiques. Je ne connais aucun guide pour faire exactement ce que vous cherchez - votre recherche google est aussi bonne que la mienne. –

+0

le lien vers la première phrase a été posté par moi. Ainsi, le codage a toujours la même erreur. comme je l'ai découvert que les données ne sont pas enregistrées après avoir utilisé l'aide donnée par le lien – lol

0

Ne pas oublier d'utiliser:

[userPreferences synchronize]; 
Questions connexes