首页 > 解决方案 > TextField 中的分组分隔符

问题描述

我将 Int 与 NumberFormatter 一起传递给 TextField

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 将包含组分隔符,它是,但仅在初始状态下,稍后,当我更改值时:添加和删除新数字,它与简单字符串一样工作,只是忽略分隔符应该在的位置。

如果我使用代理

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

标签: iosswiftswiftuitextfieldnumberformatter

解决方案


您是否尝试onEditingChanged对 TextField 使用完成?我建议当用户开始编辑时,您可以删除格式并让用户编辑电话号码。当用户完成编辑后,您可以再次显示格式化的数字。

像这样的东西:


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

我还没有测试过代码,但你可以修改它以满足你的需要。此外,您可能有一个单独的绑定和模型变量


推荐阅读