Swift 5: UITextField AttributedText не обновляется при смене валюты
У меня есть поле CurrencyTextfield, которое является CurrencyTextFieldRepresentable, потому что я использую его внутри представления SwiftUI. У меня есть строка с атрибутами, которую я обновляю в инициализации в setStyles() и в editChanged(), проблема в том, что я меняю валюту с помощью ActionSheet в SwiftUI (это работает нормально), например, с ARS на USD в текстовом поле. $0 по-прежнему отображается, когда должен быть виден USD0, однако, когда я начинаю писать, например, 100, текст корректно обновляется до USD100. Как я могу обновить текстовое поле при смене типа валюты? Не только когда я редактирую. Это мой код:
class TextFieldTest: UITextField {
@Binding private var amount: Int
@Binding var currency: Currency
init(amount: Binding<Int>, currency: Binding<Currency>) {
self._amount = amount
self._currency = currency
super.init(frame: .zero)
addTarget(self, action: #selector(editingChanged), for: .editingChanged)
addTarget(self, action: #selector(resetSelection), for: .allTouchEvents)
delegate = self
setStyles()
}
@objc private func resetSelection() {
selectedTextRange = textRange(from: endOfDocument, to: endOfDocument)
}
@objc private func editingChanged() {
attributedText = addAttributedString(amountString)
amount = Int(amountString.onlyDigits) ?? 0
}
var decimal: Decimal {
let numberString = textValue.onlyDigits
let decimal = Decimal(string: numberString, locale: self.formatter.locale) ?? 0
return decimal
}
var amountString: String {
formatter.string(from: NSDecimalNumber(decimal: decimal)) ?? "0"
}
private func setStyles() {
textAlignment = .center
keyboardType = .decimalPad
attributedText = addAttributedString(amountString)
}
private func addAttributedString(_ string: String) -> NSMutableAttributedString {
let mainString = currency.symbol + string
let stringToColor = currency.symbol
let range = (mainString as NSString).range(of: stringToColor)
let mutableAttributedString = NSMutableAttributedString.init(string: mainString)
mutableAttributedString.addAttributes([
.foregroundColor: .green,
.font: .systemFont),
.baselineOffset: 4
], range: range)
return mutableAttributedString
}
}