【问题标题】:Function in textFieldDidEndEditing is running when it’s not supposed to runtextFieldDidEndEditing 中的函数在不应该运行时正在运行
【发布时间】:2022-06-11 20:00:47
【问题描述】:

我有 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 条件也会运行。为什么会这样?

编辑

感谢@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)
}

【问题讨论】:

  • 您是否调试过代码以查看文本字段的值?另外,如果这两种情况不同,您可以从其中任何一种情况中返回/否则如果您的情况。
  • @tomerpacific 哦,谢谢,那行得通。但是知道为什么上面的代码不起作用吗?
  • 一个猜测 - 调用 .text 时返回的值可能不是空字符串。
  • @tomerpacific Hmm lemme 只是尝试运行 IF 条件而不运行方法
  • @tomerpacific 我已经编辑了问题,请查看。奇怪的是它在这里只运行第一个 IF 条件,但是当我调用这些方法时,它同时运行了两个 IF 条件。

标签: swift uitextfield


【解决方案1】:

问题在于你的逻辑。

让我们分解它以使事情更清楚。

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

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

如果条件为真,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 子句返回或没有 if/else 流程,因此当以下文本字段具有值时,下一个 if 的计算结果为 true:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多