textFieldDidEndEditing 中的函数是 运行ning 而它不应该 运行

Function in textFieldDidEndEditing is running when it’s not supposed to run

我有 5 个文本字段:

当我在任意 4 个文本字段中键入值时,应该计算该值并且它应该出现在第 5 个文本字段中。

例如,如果我在“利息”、“每月付款”、“终值”和“付款次数”文本字段中输入值,则应计算出一个值,该值应出现在“本金金额”文本字段中。 计算在关闭键盘时进行 (textFieldDidEndEditing)。

这是相关代码:

// When the user has finished typing
func textFieldDidEndEditing(_ textField: UITextField) {

    // Principal Amount
    let P = Double(principalAmountTextField.text!)
    // Interest rate
    let r = Double(interestTextField.text!)
    // Monthly Payment
    let PMT = Double(monthlyPaymentTextField.text!)
    // Number of Payments
    let t = Double(numOfPaymentsTextField.text!)
    // Future Value
    let A = Double(futureValueTextField.text!)
    
    

    // Check if the necessary text fields are filled to find Principal Amount
    if futureValueTextField.text != "" && interestTextField.text != "" && numOfPaymentsTextField.text != "" && monthlyPaymentTextField.text != "" {
        print(1)

        principalAmountTextField.text = String(calculatePrincipalAmountCompound(futureValue: A!, interestRate: r! / 100, payment: PMT!, numOfPayments: t!))
    }

    // Check if the necessary text fields are filled to find Monthly Payment
    if futureValueTextField.text != "" && principalAmountTextField.text != "" && numOfPaymentsTextField.text != "" && interestTextField.text != "" {
        print(2)
        
        monthlyPaymentTextField.text = String(calculateMonthlyPaymentCompound(principalAmount: P!, futureValue: A!, numOfPayments: PMT!, interestRate: r! / 100))
    }
}

很明显,如果我在利息、每月付款、未来价值和付款次数文本字段中输入值,只有 textFieldDidEndEditing 方法中的第一个 IF 条件应该 运行,但出于某种原因,第二个 IF 条件 运行s 也是。

我不知道为什么 运行s,如果有人能帮助我,我将不胜感激。

编辑: 多亏了@tomerpacific,我才能够完成这项工作。 但我仍然不知道为什么上面的代码不起作用,我只是尝试 运行 在不调用方法的情况下设置 IF 条件并且它可以正常工作:

// Check if the necessary text fields are filled to find Principal Amount
if futureValueTextField.text != "" && interestTextField.text != "" && numOfPaymentsTextField.text != "" {
        
    print(11)
}
    
// Check if the necessary text fields are filled to find Monthly Payment
if futureValueTextField.text != "" && principalAmountTextField.text != "" && numOfPaymentsTextField.text != "" && interestTextField.text != "" {

    print(22)
}

问题出在你的逻辑上

让我们分解一下,让事情更清楚。

if futureValueTextField.text != "" && interestTextField.text != "" && numOfPaymentsTextField.text != "" && monthlyPaymentTextField.text != "" {
        print(1)

        principalAmountTextField.text = String(calculatePrincipalAmountCompound(futureValue: A!, interestRate: r! / 100, payment: PMT!, numOfPayments: t!))
    }

当此 if 条件为真时,principalAmountTextField 获得一个值。

因此,在此条件之后,以下文本字段具有值:

  • futureValueTextField

  • 兴趣文本字段

  • numOfPaymentsTextField

  • monthlyPaymentTextField

  • principalAmountTextField

    // Check if the necessary text fields are filled to find Monthly Payment
      if futureValueTextField.text != "" && principalAmountTextField.text != "" && numOfPaymentsTextField.text != "" && interestTextField.text != "" {
          print(2)
    
          monthlyPaymentTextField.text = String(calculateMonthlyPaymentCompound(principalAmount: P!, futureValue: A!, numOfPayments: PMT!, interestRate: r! / 100))
      }
    

现在,由于您没有从 if 子句中 return 或没有 if/else 流程,因此当以下文本字段具有值时,下一个 if 计算结果为真:

  • futureValueTextField
  • 兴趣文本字段
  • numOfPaymentsTextField
  • principalAmountTextField

并且由于您已为 principalAmountTextField 提供了一个值,因此满足第二个 if 条件并运行代码。