2010-07-22 13 views
2

J'ai une méthode qui est appelée chaque fois qu'un contrôle sur ma vue change et doit mettre à jour un UILabel. Il a deux UITextField s et deux UISlider s. Je vérifie d'abord si l'un des UITextField s est vide et si c'est le cas, signalez qu'ils doivent être remplis. Sinon, je prends la différence entre les valeurs UITextField s et génère un couple de float s à utiliser dans mes NSString s .Méthode gâchée - problèmes de structure et de manipulation de chaînes si/alors

Je reçois un avertissement que message n'est pas utilisé et je reçois une erreur sur les NSString s (ne me souviens pas exactement ce que - je ne suis pas mon Mac ...)

Et même quand je haché les messages vers quelque chose de simple qui a fonctionné, quand delta == 0, il fait le message delta <= 0.

Oh, et les chaînes ne mettent pas les valeurs là où sont les signes %, elles impriment simplement les signes %.

J'ai piraté à ce trop long et besoin d'aide ...

- (void)updateAdvice { 
    if ([chlorineSourceField.text isEqualToString:@""] || [poolVolumeField.text isEqualToString:@""]) { 
     NSString *message = [[NSString alloc] initWithString:@"Enter a chlorine source and pool volume."]; 
    } 
    else { 
     int delta = [targetLabel.text intValue] - [startingLabel.text intValue]; 
     float chlorineAmount = delta * [poolVolumeField.text intValue] * chlorineConstant; 
     float percentRemove = (1 - ([targetLabel.text floatValue]/[startingLabel.text floatValue])); 
     float gallonsRemove = percentRemove * [poolVolumeField.text intValue]; 
     if (delta == 0) { 
      NSString *message = [[NSString alloc] initWithString:@"No adjustments necessary. You're on target"]; 
     } 
     if (delta >= 0) { 
      NSString *message = [[NSString alloc] initWithFormat:@"To increase FC by %dppm, add %3.1f oz of %@.", delta, chlorineAmount, chlorineSourceField.text]; 
     } 
     if (delta <= 0) { 
      NSString *message = [[NSString alloc] initWithFormat:@"You're above target already. Replace %d%% or %d gallons of water - or just wait for it to come down.", percentRemove*100, gallonsRemove]; 
     } 
    } 
    adviceLabel.text = message; 
    [message release]; 
} 

Répondre

2

Il vous manque la partie else, donc les trois déclarations if sont évaluées consécutivement. Si delta == 0, il satisfera tous les trois if instructions. Ainsi, la dernière allocation écrase les deux précédentes. (Et vous perdrez la mémoire)

En outre, votre variable message est définie comme locale au bloc if dans lequel elle est déclarée. Vous pouvez déplacer la déclaration message au niveau de la fonction.

Tant que % ne fonctionne pas, vous utilisez l'initialiseur d'instance initWithFormat avec la syntaxe de l'initialiseur de classe stringWithFormat. initWithFormat prend les paramètres de la chaîne formatée dans un paramètre distinct - arguments:. (Btw, il faut également locale:)

+0

Duh, je ne veux pas moins-que-OU-égal, juste moins que. Je suis nouveau dans le monde C Puis-je simplement utiliser '<' and '>' dans la condition? Le '==' pour les égales me rejette =) Et savez-vous pourquoi les trucs% d ne fonctionneraient pas? – Steve

+0

Oui, vous pouvez simplement utiliser '<' and '>'. J'ajouterais toujours les blocs 'else' aux blocs' if' - vous n'avez pas besoin que les trois soient toujours évalués. Non, je ne sais pas pourquoi la partie% d ne fonctionne pas. –

+0

En fait, je viens de comprendre pourquoi le% d ne fonctionne pas. Je vais mettre à jour ma réponse. –

1

En ce qui concerne la variable message va, il est scope ne peut donc pas être utilisé en dehors de la déclaration if/else dans lequel il est déclaré. Vous voulez le déclarer avant l'instruction if, de sorte que vous pouvez l'utiliser en dehors de l'instruction if. Donc, quelque chose comme ceci:

- (void)updateAdvice { 
    NSString *message = nil; 

    if ([chlorineSourceField.text isEqualToString:@""] || [poolVolumeField.text isEqualToString:@""]) { 
     message = [[NSString alloc] initWithString:@"Enter a chlorine source and pool volume."]; 
    } 
    else { 
     int delta = [targetLabel.text intValue] - [startingLabel.text intValue]; 
     float chlorineAmount = delta * [poolVolumeField.text intValue] * chlorineConstant; 
     float percentRemove = (1 - ([targetLabel.text floatValue]/[startingLabel.text floatValue])); 
     float gallonsRemove = percentRemove * [poolVolumeField.text intValue]; 
     if (delta == 0) { 
      message = [[NSString alloc] initWithString:@"No adjustments necessary. You're on target"]; 
     } 
     if (delta >= 0) { 
      message = [[NSString alloc] initWithFormat:@"To increase FC by %dppm, add %3.1f oz of %@.", delta, chlorineAmount, chlorineSourceField.text]; 
     } 
     if (delta <= 0) { 
      message = [[NSString alloc] initWithFormat:@"You're above target already. Replace %d%% or %d gallons of water - or just wait for it to come down.", percentRemove*100, gallonsRemove]; 
     } 
    } 
    adviceLabel.text = message; 
    [message release]; 
} 
+0

Merci! Je n'aurais jamais compris ça sans aide! +1 – Steve