两个TextFields的值被添加到第一个

时间:2018-06-05 23:30:32

标签: ios swift uitextfield

希望有人可以帮助我解决我在Swift中遇到的这个问题。我有三个文本字段,其中包括价格,然后是利息百分比,最后是应该输入的月数。但是,当我输入百分比或月数时,它们会在我运行模拟器时加到价格中。任何帮助搞清楚这一点都会非常感激,因为我一直在努力。

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var priceTextField: UITextField!
    @IBOutlet weak var payoutTextField: UITextField!
    @IBOutlet weak var leasingPeriodTextField: UITextField!
    @IBOutlet weak var payoutLabel: UILabel!

    var amt: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        priceTextField.delegate = self
        payoutTextField.delegate = self
        leasingPeriodTextField.delegate = self

        priceTextField.placeholder = updateAmount()
    }

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if let digit = Int(string) {
            amt = amt * 10 + digit

            if amt > 1_000_000_00 {
                let alert = UIAlertController(title: "Indtast venligst 1 million eller mindre", message: nil, preferredStyle: UIAlertControllerStyle.alert)

                alert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default, handler: nil))

                present(alert, animated: true, completion: nil)

                priceTextField.text = ""

                amt = 0
            } else {
                priceTextField.text = updateAmount()
            }
        }

        if string == "" {
            amt = amt/10

            priceTextField.text = updateAmount()
        }

        return false
    }

    func updateAmount() -> String? {
        let formatter = NumberFormatter()

        formatter.numberStyle = NumberFormatter.Style.currency
        formatter.locale = Locale(identifier: "da_DK")

        let amount = Double(amt/100) + Double(amt%100)/100

        return formatter.string(from: NSNumber(value: amount))
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: 
        UIEvent?) {
        self.view.endEditing(true)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == priceTextField {
            payoutTextField.becomeFirstResponder()
        } else if textField == payoutTextField {
            leasingPeriodTextField.becomeFirstResponder()
        } else if textField == leasingPeriodTextField{
            leasingPeriodTextField.resignFirstResponder()
        }
        return true
    }
}

4 个答案:

答案 0 :(得分:1)

不要在priceTextField中硬编码shouldChangeCharactersIn。使用textField参数。请记住,将为所有三个文本字段调用shouldChangeCharactersIn(以及您可能拥有的任何其他文本字段委托方法)。如果您希望对每个文本字段进行不同的处理,则需要添加一些if语句。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField === priceTextField {
        // logic just for the price field
    } else {
        // The other text fields
        // return true
    }
}

这只是您可能需要的一个示例,具体取决于您的需求。

但请记住在逻辑中使用textField参数,而不是硬编码特定的插座(除了查看正在处理的文本字段)。

答案 1 :(得分:0)

因为您在priceTextField更新shouldChangeCharactersIn而未检查当前有效的文本字段是否为priceTextField

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

            if  textField === priceTextField {
 if let digit = Int(string) {
            amt = amt * 10 + digit

            if amt > 1_000_000_00 {
                let alert = UIAlertController(title: "Indtast venligst 1 million eller mindre", message: nil, preferredStyle: UIAlertControllerStyle.alert)

                alert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default, handler: nil))

                present(alert, animated: true, completion: nil)

                priceTextField.text = ""

                amt = 0
            } else {
                priceTextField.text = updateAmount()
            }
           }

        }

答案 2 :(得分:0)

由于您要为所有三个文本字段添加相同的viewController类作为委托

  

textField(_ textField:UITextField,shouldChangeCharactersIn范围:NSRange,replacementString string:String)

每当更改任何文本字段中的文本时,都会调用

。为了避免这种情况,您可以像在textFieldShouldReturn中那样进行相同的检查。

答案 3 :(得分:0)

您正在将所有文本字段设置为UITextFieldDelegate,因此在每个文本字段上调用textField(_:shouldChangeCharactersIn:replacementString :)方法

您必须根据

进行更新
 if let digit = Int(string) { 
    amt = amt * 10 + digit
    //if interest or month this well be skipped 
     if amt > 1_000_000_00 {
     }
    // you get here .. while amt is already updated so your price will update as well
     else {
      priceTextField.text = updateAmount() 
    }
    ....
    }

你可以这样做(让temp = amt * 10 + digit)但是检查文本字段是否是第一个价格

 if let digit = Int(string) { 
        let temp = amt * 10 + digit
         if temp > 1_000_000_00 {
            //update amt = 0
         }
         else {
          priceTextField.text = updateAmount() 
        }
        ....
        }