NSMutableArray / NSMutable Словарь, не сохраняющий данные на writeToFile - PullRequest
1 голос
/ 12 марта 2010

У меня есть метод, который называется addHighScore. Когда пользователь хочет выйти из игры, он может сохранить свой счет. В папке ресурсов я создал highScore.plist и заполнил его одной записью. Структура:

   item 1 (array)
      Name (dictionary, string)
      Level (dictionary, string)
      Score(dictionary, Number)

Моя проблема заключается в следующем: когда я запускаю это в симуляторе, после того, как я загружаю arrHighScores и затем добавляю словарь newScore, все выглядит нормально, и записи добавляются (и показываются с помощью оператора NSLog), но это ТОЛЬКО до тех пор, пока как приложение работает. Как только я выйду, вернусь, единственная существующая запись - та, которую я ввел вручную.

Когда я запускаю это на устройстве (iPhone), он никогда не показывает добавленные записи, даже когда он еще находится в игре. Я рассмотрел почти каждый пример, касающийся NSDictionary, и не могу понять, что происходит не так.

Любые идеи или предложения приветствуются. Заранее спасибо за любую помощь. (Гео ...)

Мой метод выглядит так:

 -(IBAction) addHighScore {
    NSString *myPath = [[NSBundle mainBundle] pathForResource:@"highScores" ofType:@"plist"];
    NSLog(@"myPath: %@", myPath);
    NSMutableArray *arrHighScores = [[NSMutableArray alloc] initWithContentsOfFile:myPath];

    NSMutableDictionary *newScore = [[NSMutableDictionary alloc] init];
    [newScore setValue:@"Geo" forKey:@"Name"];
    [newScore setValue:lblLevel.text forKey:@"Level"];
    [newScore setValue:[NSNumber numberWithDouble: dblScore] forKey:@"Score"];

    [arrHighScores addObject:newScore];

    for (int i = 0; i < [arrHighScores count]; i++) {
        NSLog(@"Retreiving (%d) --> %@", i, [arrHighScores objectAtIndex:i]);
    }

    [arrHighScores writeToFile:myPath atomically:YES];

    NSMutableArray *tmpArray2 = [[NSMutableArray alloc] initWithContentsOfFile:myPath];

    NSSortDescriptor *mySorter = [[NSSortDescriptor alloc] initWithKey:@"Score" ascending:YES];
    [tmpArray2 sortUsingDescriptors:[NSArray arrayWithObject:mySorter]];    

    for (int i = 0; i < [tmpArray2 count]; i++) {
        NSLog(@"Retreiving (%d) --> %@", i, [tmpArray2 objectAtIndex:i]);
    }

    [arrHighScores release];
    [tmpArray2 release];
    [mySorter release];
    [newScore release]; 

}

1 Ответ

4 голосов
/ 12 марта 2010

Проблема в том, что вы пытаетесь сохранить свои изменения в комплекте приложений, но у вас нет прав на запись в них. Правильным местом для сохранения данных является папка Documents в изолированной программной среде приложения - вы можете получить путь:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                             NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

Таким образом, правильный рабочий процесс должен быть:

  1. Попробуйте загрузить данные рекордов из папки «Документы»
  2. Если файл в папке «Документы» не существует, загрузить данные из ресурсов
  3. Обновить данные
  4. Сохранить данные в папке «Документы»

См. Также «Часто используемые каталоги» для получения дополнительной информации о том, где вы можете и должны сохранять данные приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...