2017-01-26 8 views
0

Я пытаюсь сделать приложение, которое является очень простым. Одна часть приложения состоит в том, что есть 4 текстовых поля и кнопка, которая вычисляет сумму этих текстовых полей. Проблема, с которой я сталкиваюсь, заключается в том, что я набираю значение 10 в первом текстовом поле, а затем нажимаю кнопку. Результат будет 10. Однако, если я снова нажму его (не набрав ничего в других текстовых полях), результат будет равен 20 !! Кроме того, если я напечатаю 20 в одном из других текстовых полей, результат будет равен 40! Результат ДОЛЖЕН БЫТЬ 30 НЕ 40 !! Один из возможных вариантов, о которых я думал (еще не пробовал) назначает 0 всем текстовым полям при нажатии кнопки. Но я бы хотел, чтобы приложение было умнее и отслеживало результат.как игнорировать значение UITextField, которое уже было рассчитано в swift 3?

, если это поможет, вот код внутри кнопки, которая вычисляет сумму:

@IBAction func calBtnPressed(_ sender: UIButton) { 
     var benifit:[Double] = [] 

    var textFields: [Double] = [] 



    if initialBalance.text?.isEmpty ?? true { 

      // do nothing 

    } else { 

     if let temp = initialBalance.text { 

      // these lines of code will convert arabic numbers to English ones in case the user uses Arabic number 

      let initialStr: String = temp 
      let initialFormatter: NumberFormatter = NumberFormatter() 
      initialFormatter.locale = NSLocale(localeIdentifier: "EN") as Locale! 
      let initialFinal = initialFormatter.number(from: initialStr) 
      benifit.append(Double(initialFinal!)) 
     } 
    } 



    if income.text?.isEmpty ?? true { 

     // do nothing 


    } else { 

     if let temp = income.text { 

     // these lines of code will convert Arabic numbers to English ones in case the user uses Arabic number 

      let incomeStr: String = temp 
      let incomeFormatter: NumberFormatter = NumberFormatter() 
      incomeFormatter.locale = NSLocale(localeIdentifier: "EN") as Locale! 
      let incomeFinal = incomeFormatter.number(from: incomeStr) 
      benifit.append(Double(incomeFinal!)) 
     } 
    } 



    if salaries.text?.isEmpty ?? true { 

     // do nothing 


    } else { 

     if let temp = salaries.text { 

      let salariesStr: String = temp 
      let salariesFormatter: NumberFormatter = NumberFormatter() 
      salariesFormatter.locale = NSLocale(localeIdentifier: "EN") as Locale! 
      let salariesFinal = salariesFormatter.number(from: salariesStr) 
      textFields.append(Double(salariesFinal!)) 
     } 
    } 


    if tools.text?.isEmpty ?? true { 

     // do nothing 

    } else { 

     if let temp = tools.text { 

      let toolsStr: String = temp 
      let toolsFormatter: NumberFormatter = NumberFormatter() 
      toolsFormatter.locale = NSLocale(localeIdentifier: "EN") as Locale! 
      let toolsFinal = toolsFormatter.number(from: toolsStr) 
      textFields.append(Double(toolsFinal!)) 
     } 
    } 



    if maintinance.text?.isEmpty ?? true { 

     // do nothing 

    } else { 

     if let temp = maintinance.text { 

      let maintinanceStr: String = temp 
      let maintinanceFormatter: NumberFormatter = NumberFormatter() 
      maintinanceFormatter.locale = NSLocale(localeIdentifier: "EN") as Locale! 
      let maintinanceFinal = maintinanceFormatter.number(from: maintinanceStr) 
      textFields.append(Double(maintinanceFinal!)) 
     } 
    } 


    if other.text?.isEmpty ?? true { 

     // do nothing 


    } else { 

     if let temp = other.text { 

     let otherStr: String = temp 
     let otherFormatter: NumberFormatter = NumberFormatter() 
     otherFormatter.locale = NSLocale(localeIdentifier: "EN") as Locale! 
     let otherFinal = otherFormatter.number(from: otherStr) 
     textFields.append(Double(otherFinal!)) 
     } 
    } 

    for textField in textFields { 

     sumExpenses += textField 
    } 

    for ben in benifit{ 

     sumBenifit += ben 
    } 

    totalExpenses.text = String(sumExpenses) 

    totalAfterSubtractingExpenses.text = String(sumBenifit - sumExpenses) 

    sumBenifit -= sumExpenses 

} 
+0

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

+0

На самом деле, у вас уже есть массив textFields, так почему бы вам не использовать его? –

+0

Спасибо за ваш комментарий, но я не совсем уверен, что понимаю вас. которые пять строк повторяю? это пять строк для перевода арабских цифр на английский? Я ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО ЛЮБЛЮ, ЧТОБЫ СДЕЛАТЬ МОЙ КОД, БОЛЬШЕ CONCISE – user2066392

ответ

2

Я думаю, что я нашел вашу проблему.

Вы используете переменную sumBenefit, которая не объявлена ​​в вашем func, поэтому я предполагаю, что она объявлена ​​в вашем UIViewController.

Поскольку это переменная экземпляра, она не будет сбрасываться при каждом нажатии кнопки.

Если вы хотите сбросить значения sumExpensessumBenefits и каждый раз при нажатии на кнопку, то вы должны сделать что-то вроде этого:

sumExpenses = 0 
for textField in textFields { 
    sumExpenses = Int(textField.text)! 
} 

sumBenefit = 0 
for ben in benefit { 
    sumBenefit += ben 
} 

Я также сделать предположение о том, что вы хотите номер из вашего textField в первом for-loop, потому что если sumExpenses имеет тип Int (или любой другой номер, если на то пошло), то sumExpenses += textField не будет компилироваться. Вы должны принять текст этого textField и преобразовать его в Int.

Опять же, я все еще не очень понимаю, что вы пытаетесь сделать, но, пожалуйста, дайте мне знать, если это сработает для вас, или если вам нужно дополнительное разъяснение.

+0

sumBenefit - глобальная переменная внутри того же класса, что и код, который я предоставил. Я попробую ваше предложение и вернусь сюда – user2066392

+0

Я просто попробовал это быстро, и это сработало! БОЛЬШОЕ СПАСИБО!!!! – user2066392

+0

@ пользователь2066392 проблем нет. Рад был помочь :) –