希望有人可以帮助我解决我在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
}
}
答案 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()
}
....
}