Разделители групп в TextField - PullRequest
0 голосов
/ 25 мая 2020

Я передаю Int в TextField вместе с NumberFormatter

private var numberFormatter: NumberFormatter {
    let numberFormatter = NumberFormatter()
    numberFormatter.numberStyle = .decimal
    numberFormatter.locale = Locale(identifier: "pl")
    return numberFormatter
}

TextField(placeholder, value: self.$amount, formatter: self.numberFormatter)

И я ожидаю, что TextField будет включать разделители групп, и это так, но только в исходном состоянии, позже, когда я изменю значение: add и удаляет новые цифры, он работает так же, как с простой строкой, просто игнорирует места, где должны быть разделители.

Если я использую прокси

var amountProxy: Binding<String> {
    Binding<String>(
        get: { self.numberFormatter.string(from: NSNumber(value: self.amount)) ?? "" },
        set: {
            let cleanValue = $0.replacingOccurrences(of: self.numberFormatter.groupingSeparator, with: "")
            if let value = self.numberFormatter.number(from: cleanValue) {
                self.amount = value.intValue
            }
        }
    )
}

TextField(placeholder, text: amountProxy)

Он форматирует его правильно, но когда добавляет новый разделитель, отображает курсор от последней позиции до lastPosition + numberOfSeparators

1 Ответ

0 голосов
/ 26 мая 2020

Вы пробовали использовать завершение onEditingChanged для TextField? Я бы посоветовал, когда пользователь начнет редактирование, вы можете удалить форматирование и позволить пользователю редактировать номер телефона. Когда пользователь закончит редактирование, вы можете снова показать отформатированное число.

Примерно так:


TextField(placeholder, text: $amount, onEditingChanged: { (editing) in
    if editing {
        amountBinding = amount
    } else {
        amountBinding = amount.formatted()
    }
})

Я не тестировал код, но вы можете изменить его в соответствии со своими потребностями. Также у вас, вероятно, может быть отдельная привязка и переменная модели

...