Question

(problème résolu maintenant, voir les réponses ci-dessous)

Bonjour, dans mon application, je suis en train de créer un compteur de points. Cela augmente un nombre de 10 à chaque fois qu'un bouton est enfoncé.

Je réussi à obtenir mon application pour augmenter une valeur (0) par 1 chaque fois qu'un bouton est pressé, et de se rappeler la dernière valeur et afficher la prochaine fois que le démarrage de l'application. Mais lorsque vous appuyez sur le bouton qui est supposé augmenter la valeur des points par 1 après l'application redémarre le nombre commence à augmenter de 0 pas la valeur mémorisée.

Comment puis-je obtenir les points pour augmenter de 10 et rappelez-vous la dernière valeur et l'affichage (et compter de celui-ci) après l'application est sorti et a commencé à nouveau?

Voici mon code actuel:

Code pour le bouton pour augmenter la valeur de 1:

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

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

Méthode de 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];
}
Était-ce utile?

La solution

Il y a deux choses qui se passent ici. Tout d'abord, vous enregistrez le nombre avant que vous incrémenter. Cela signifie que même si l'économie se passait, il serait un plus faible que prévu.

Le bug réel que vous voyez est bien que vous éludant comte. Si vous regardez, vous remarquerez que vous avez la ligne suivante dans viewDidLoad:

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

malgré le fait que se référer directement à compter en startClick :. Je présume que vous avez également un compte nommé Ivar et que ce qui se passe est vous dire pour définir le Ivar, mais vous êtes en fait le réglage de la variable locale. Le Ivar sera réglé sur 0 par défaut lorsque la classe est ventilés entre, ce qui est la raison pour laquelle il semble toujours être remis à zéro. Vous pouvez le réparer en changeant que, comme à:

count = [prefs integerForKey: @ "message d'accueil"];

Il est également possible vos valeurs ne sont pas synchronisées sur le disque si vous s'écraser lors de l'application quitter, mais à moins que vous voyez des collisions dans le journal d'exécution qui ne devrait pas être un problème. Vous pouvez explicitement synchronisez la valeur si elle est importante.

Vous compilez ce code avec des avertissements sous tension? Essayez-vous de corriger ces mises en garde? Si vous avez des avertissements sous tension, vous devriez voir quelque chose comme « déclaration locale de « count » cache variable d'instance »

Autres conseils

Dans la méthode startClick:, vous semblez stocker l'entier count dans les paramètres utilisateur par défaut avant qu'il ait été incrémentée. Si vous voulez augmenter par 10, puis changer la méthode:

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

En outre, pourquoi avez-vous mis deux fois la propriété counter.text:

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

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

Il peut également être utile pour vous d'utiliser stringWithFormat au lieu d'allouer un NSString et appelant initWithFormat, car au moment où il fuit la mémoire parce que vous ne relâchez pas; si vous appelez stringWithFormat, elle retourne un objet autoreleased, qui sera conservé lorsque counter.text est réglé (car il est un raccourci pour la méthode setter) vous aurez donc pas de problèmes de mémoire. Vous pouvez changer la ligne à:

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

Ce qui vous délivrerai de récupérer la valeur du compteur en tant que chaîne des valeurs par défaut de l'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top