Запутанный метод - если / то проблемы со структурой и манипуляциями со строками - PullRequest
2 голосов
/ 22 июля 2010

У меня есть метод, который вызывается каждый раз, когда изменяется элемент управления моего представления, и он должен обновить UILabel. Он имеет два UITextField с и два UISlider с. Сначала я проверяю, являются ли какие-либо из UITextField пустыми, и если да, советую их заполнить. В противном случае я получаю разницу между значениями UITextField s и генерирую пару float s. использовать в моих NSString с.

Я получаю предупреждение о том, что message не используется, и я получаю сообщение об ошибке NSString s (сейчас не могу вспомнить, что именно - я не на своем Mac ...)

И даже когда я свел сообщения к чему-то простому, что сработало, когда delta == 0, оно отправляет сообщение delta <= 0.

О, и строки не помещают значения в то место, где находятся знаки %, они просто печатают знаки %.

Я слишком долго взламывал это, и мне нужна помощь ...

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

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

Вам не хватает части else, поэтому все три оператора if оцениваются последовательно.Если delta == 0, он будет удовлетворять всем трем if утверждениям.Таким образом, последнее распределение перезапишет два предыдущих.(И у вас будет утечка памяти)

Кроме того, ваша переменная message имеет локальную область для блока if, в котором она объявлена.Возможно, вы захотите переместить объявление message на уровне уровня функции.

Поскольку % не работает, вы используете инициализатор экземпляра initWithFormat с синтаксисом дляинициализатор класса stringWithFormat.initWithFormat принимает параметры для форматированной строки в отдельном параметре - arguments:.(Кстати, это также требует locale:)

1 голос
/ 22 июля 2010

Что касается переменной message, то она имеет область видимости, поэтому ее нельзя использовать вне оператора if / else, в котором она объявлена. Вы хотите объявить его до оператора if, чтобы вы могли использовать его вне оператора if. Так что-то вроде этого:

- (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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...