2010-12-01 4 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 массива высоких оценок (не забудьте выпустить его), когда хотите изменить ситуацию. Либо замените оценку, либо удалите/добавьте.

Используя этот подход, вам не нужно прибегать к (извините за это) ghastly Подход «string #» с фиксированным количеством баллов. Ваш массив будет содержать только существующие оценки. Без отходов и всех 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

Не забудьте использовать:

[userPreferences synchronize]; 
Смежные вопросы