UITextLabel обновляется в другом порядке во время возврата UITextField, чем другие записи. - PullRequest
0 голосов
/ 21 сентября 2018

Хорошо, у меня есть 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) }
}

Когда я ввожу цифры на клавиатуре, все обновляется правильно.Однако, когда я нажимаю клавишу Backspace, текстовое поле сохраняет старое значение.Я вставил несколько операторов печати, чтобы увидеть, что происходило, и когда ударил backspace, UITextLabel обновляется до того, как удаление происходит внутри кода CurrencyField.Когда нажата цифра, UITextLabel обновляется ПОСЛЕ кода CurrencyField.Я понятия не имею, как решить эту проблему, любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 сентября 2018

Попробуйте ниже:

Добавьте пользовательский метод для изменения значения в 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
}
...