iPhone SDK: я пытаюсь увеличить целое число на 10 и не удается - PullRequest
1 голос
/ 12 июля 2009

(проблема решена, см. Ответы ниже)

Здравствуйте, в моем приложении я пытаюсь создать счетчик очков. Это увеличивает число на 10 каждый раз, когда нажимается кнопка.

Мне удалось заставить мое приложение увеличивать значение (0) на 1 при каждом нажатии кнопки, запоминать последнее значение и отображать его при следующем запуске приложения. Но когда вы нажимаете кнопку, которая предполагает увеличение значения баллов на 1 после перезапуска приложения, число начинает увеличиваться с 0, а не с запомненного значения.

Как заставить точки увеличиваться на 10 и запоминать последнее значение и отображать (и считать из него) после выхода из приложения и повторного запуска?

Вот мой текущий код:

Код кнопки для увеличения значения на 1:

   - (IBAction)startClick:(id)sender{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:count forKey:@"greeting"];

NSString *numValue = [[NSString alloc] initWithFormat:@"%d", count++];
counter.text = numValue;

Метод viewDidLoad:

   - (void)viewDidLoad {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *greetName = [prefs stringForKey:@"greeting"];
NSInteger count = [prefs integerForKey:@"greeting"];
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];

if(count == 0) {
    counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
} else {
    counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
}

Ответы [ 2 ]

3 голосов
/ 12 июля 2009

В вашем методе startClick: вы, кажется, сохраняете целое число count в пользовательских значениях по умолчанию, прежде чем оно будет увеличено. Если вы хотите увеличить его на 10, измените метод на:

- (IBAction)startClick:(id)sender {
    //Increase count by 10
    count+=10;

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setInteger:count forKey:@"greeting"];

    NSString *numValue = [[NSString alloc] initWithFormat:@"%d", count];
    counter.text = numValue;
}

Кроме того, почему вы устанавливаете свойство counter.text дважды?:

counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];

if(count == 0) {
        counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
} else {
        counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
}

Также может быть полезно использовать stringWithFormat вместо выделения NSString и вызова initWithFormat, поскольку в данный момент происходит утечка памяти, потому что вы ее не освобождаете; если вы вызовете stringWithFormat, он вернет автоматически освобожденный объект, который будет сохранен при установке counter.text (поскольку это сокращение для метода установки), поэтому у вас не будет проблем с памятью. Вы можете изменить строку на:

counter.text = [NSString stringWithFormat:@"%d",count];

Что также избавит вас от извлечения значения счетчика в виде строки из пользовательских значений по умолчанию.

1 голос
/ 12 июля 2009

Здесь происходит несколько вещей. Прежде всего, вы сохраняете счетчик, прежде чем увеличиваете его. Это означает, что даже если бы происходило сохранение, оно было бы на единицу меньше, чем вы ожидаете.

Фактическая ошибка, которую вы видите, заключается в том, что вы учитываете счет. Если вы посмотрите, вы заметите, что у вас есть следующая строка в viewDidLoad:

NSInteger count = [prefs integerForKey:@"greeting"];

несмотря на то, что напрямую ссылаются на count в startClick :. Я предполагаю, что у вас также есть ивар с именем count и что вы хотите установить ivar, но на самом деле вы устанавливаете локальную переменную. При выделении класса ivar будет установлен в 0 по умолчанию, поэтому он всегда обнуляется. Вы можете исправить это, изменив что-то вроде:

count = [prefs integerForKey: @ "reeting "];

Также возможно, что ваши значения не синхронизируются на диск, если вы зависаете при выходе из приложения, но если вы не видите сбоев в журнале выполнения, это не должно быть проблемой. Вы можете явно синхронизировать значение, если оно важно.

Вы компилируете этот код с включенными предупреждениями? Вы пытаетесь исправить эти предупреждения? Если у вас включены предупреждения, вы должны увидеть что-то вроде "локальное объявление 'count' скрывает переменную экземпляра"

...