从UITextField获取值,计算另一个值,并更新UILabel

时间:2016-10-17 22:12:22

标签: ios swift cocoa-touch calculator

我正在开发一个简单的计算器应用程序。我有我的"文本框"用于输入和输出标签,两者都放在视图控制器中。

我想将文本框中的输入作为整数,进行一些数学计算,如乘法,然后输出到文本标签。

如何进行这样简单的计算?

使用此代码,我在行var mDeposit = enterMoneyAmount - deposit上收到错误:

  

二元运营商' - '不能应用于' UITextField'类型的操作数和' Int'

import UIKit

class ViewController: UIViewController {


    let fee = 1.20
    let tax = 1.07
    let deposit = 100


    @IBOutlet weak var moneyResults: UILabel!

    @IBOutlet weak var enterMoneyAmount: UITextField!

    @IBAction func buttonPressed(_ sender: AnyObject) {

    var mDeposit = enterMoneyAmount - deposit    // Error here
    var mDepositAndFee = mDeposit * fee
    var mDepositAndFeeAndTax = mDepositAndFee * tax


        mDepositAndFeeAndTax.text = moneyResults

     }
}

3 个答案:

答案 0 :(得分:0)

您需要将UItextLabel的文本设置为等于按下按钮后计算得到的值。

@IBAction func buttonPressed(_ sender: AnyObject) {
     endingCash = ((startingCash * fee) + (endingCash * tax) + (endingCash + deposit))
     moneyResults.text = endingCash
}

答案 1 :(得分:0)

您收到该错误是因为您目前正在尝试从Int中减去UITextField。您需要从enterMoneyAmount文本字段中获取文本,并将String?转换为Int,或处理输入错误的情况。例如:

@IBAction func buttonPressed(_ sender: AnyObject) {

    guard let moneyAmountString = enterMoneyAmount.text,
        let moneyAmountInt = Int(moneyAmountString)
        else {
        //either moneyAmountString or moneyAmountInt is nil
        //handle that input error here
        return
    }

    //enterMoneyAmountInt is now a valid Int
    var mDeposit = enterMoneyAmountInt - deposit

    /*the rest of your code here */
}

这是swift 3语法。如果写下面的swift 3,请删除守卫声明中的第二个'let'。

答案 2 :(得分:0)

您不能将UITextField视为Int(或Double或任何类型的数字)。

UITextFields的属性文本包含String类型的值。

您需要提取字符串值并将其转换为int:

@IBOutlet weak var moneyResultsLabel: UILabel!
@IBOutlet weak var enterAmountField: UITextField!

@IBAction func buttonPressed(_ sender: AnyObject) {
    let enteredAmountString = enterAmountField?.text ?? ""
    let enteredAmount: Double = Double(enteredAmountString) ?? 0
    var mDeposit = enteredAmount - deposit
    var mDepositAndFee = mDeposit * fee
    var mDepositAndFeeAndTax = mDepositAndFee * tax
    moneyResultsLabel.text = String(mDepositAndFeeAndTax)
}

我重新命名了你的网点,以明确它们是什么。 (文本字段和标签。)使用类似enterMoneyAmount的名称可以让您认为变量保持不变,并且不会指向收集用户输入的文本字段。

我还编写了我的代码,将输入值转换为浮点类型,这样用户就可以输入美元和美分的金额。 (或任何带小数的货币金额。)

该行

let enteredAmount: Double = Double(enteredAmountString) ?? 0

使用??,这是" nil合并运算符"。它说"如果左边的表达式不是零,请不要管它。如果为零,请将其替换为右侧的表达式。因此,如果enteredAmountString无法转换为Double(因为它包含" xyz",例如。),那么Double(enteredAmountString)将评估为nil。在这种情况下,它将被替换为零。