gpt4 book ai didi

swift - UITextLabel 在 UITextField 退格期间以与其他条目不同的顺序更新。

转载 作者:行者123 更新时间:2023-11-30 11:08:37 25 4
gpt4 key购买 nike

好吧,我有一个 UITextLabel,只要 UITextField 发生更改,它就会更新为任何内容。

所以我有以下方法。

func textField(_ textField: UITextField, shouldChangeCharactersInrange: NSRange, replacementString string: String) -> Bool {
payment_amount_label.text = payment_amount_tf.text!
return true
}

我将文本字段设置为货币字段。这是代码。

class CurrencyField: UITextField {
var string: String { return text ?? "" }
var decimal: Decimal {
return string.digits.decimal /
Decimal(pow(10, Double(Formatter.currency.maximumFractionDigits)))
}
var decimalNumber: NSDecimalNumber { return decimal.number }
var doubleValue: Double { return decimalNumber.doubleValue }
var integerValue: Int { return decimalNumber.intValue }
let maximum: Decimal = 9_999.99
private var lastValue: String?
override func willMove(toSuperview newSuperview: UIView?) {
// you can make it a fixed locale currency if needed
// Formatter.currency.locale = Locale(identifier: "pt_BR") // or "en_US", "fr_FR", etc
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
keyboardType = .numberPad
textAlignment = .right
editingChanged()
}
override func deleteBackward() {
text = string.digits.dropLast().string
print("inside method delete" + text!)
editingChanged()

//backspace not working for editingchanged. not sure why.
}
@objc func editingChanged(_ textField: UITextField? = nil) {
guard decimal <= maximum else {
text = lastValue
return
}
text = Formatter.currency.string(for: decimal)
lastValue = text
print("inside method editing" + text! + "last value is " + lastValue!)
return
}
}

extension NumberFormatter {
convenience init(numberStyle: Style) {
self.init()
self.numberStyle = numberStyle
}
}
extension Formatter {
static let currency = NumberFormatter(numberStyle: .currency)
}
extension String {
var digits: [UInt8] {
return map(String.init).compactMap(UInt8.init)
}
}
extension Collection where Iterator.Element == UInt8 {
var string: String { return map(String.init).joined() }
var decimal: Decimal { return Decimal(string: string) ?? 0 }
}
extension Decimal {
var number: NSDecimalNumber { return NSDecimalNumber(decimal: self) }
}

当我在键盘中输入数字时,一切都会正确更新。但是,当我按退格键时,文本字段将保留旧值。我输入了一些打印语句来查看发生了什么,当按下退格键时,UITextLabel 会在CurrencyField 代码内发生删除之前更新。当按下数字时,UITextLabel 将在CurrencyField 代码之后更新。我不知道如何解决这个问题,感谢任何帮助。

最佳答案

尝试以下:

添加自定义方法以更改 UITextField 的值,与 UITextView 相同。

viewDidLoad中:

payment_amount_tf.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

textFieldDidChange 声明为:

@objc func textFieldDidChange(_ sender: UITextField) {
payment_amount_label.text = payment_amount_tf.text
}

关于swift - UITextLabel 在 UITextField 退格期间以与其他条目不同的顺序更新。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52438107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com