2010-12-01 72 views
0

我遇到NSUserdefaults問題。當我在文本框中輸入名稱並單擊高分時,應用程序將不會響應任何內容,並且鍵盤仍將保留在屏幕上。當我試圖加載數據時,它說名稱的數據是零。我的得分是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 2010-12-01 18:25:28

+1

他修復了你破碎的代碼格式 – vikingosegundo 2010-12-01 18:28:08

回答

3

任何保存到用戶默認值必須是一個standard PLIST-compliant class(NSArray中,的NSDictionary,的NSNumber,NSString的,的NSDate,NSData的,NSValue)。如果它不是其中之一,它必須作爲一個NSData實例存檔(並且因此是NSCoding兼容的),或者如果它兼容,則打包到NSValue中。

也就是說,你讓自己變得比你需要的要困難得多。爲什麼沒有一個包含名稱(NSString)和分數(NSNumber)的字典數組(高分描述符容器)的字典(每個描述符都是高分的描述符)?每個字典都描述給定名稱的高分。然後您可以使用-setObject:yourArray forKey:@"HighScores"來存儲整個事物。

由於您只能從NSUserDefaults中獲得不可變副本,因此您希望在修改內容時要求獲得高分數組的-mutableCopy(不要忘記釋放它)。要麼替換分數,要麼刪除/添加。

使用這種方法,您不必訴諸於(對不起)可怕的「字符串#」方法與固定數量的分數。你的數組只包含現有的高分。沒有任何浪費和所有完全PLIST'able 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

不要忘記使用:

[userPreferences synchronize];