ios - 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
解决方案
您是否尝试onEditingChanged
对 TextField 使用完成?我建议当用户开始编辑时,您可以删除格式并让用户编辑电话号码。当用户完成编辑后,您可以再次显示格式化的数字。
像这样的东西:
TextField(placeholder, text: $amount, onEditingChanged: { (editing) in
if editing {
amountBinding = amount
} else {
amountBinding = amount.formatted()
}
})
我还没有测试过代码,但你可以修改它以满足你的需要。此外,您可能有一个单独的绑定和模型变量
推荐阅读
- android - billingClient.queryPurchases(BillingClient.SkuType.SUBS).getPurchasesList() 返回 null
- html - 为什么 Chrome 不更新内联块的宽度
- microsoft-graph-api - 尝试使用 Outlook REST API 在日历上创建事件时获取错误代码“ErrorIrresolvableConflict”响应
- firebase - 将 react-native 应用程序连接到 firebase 的最佳方式是什么?
- ansible - Ansible 角色断言在基于清单组中的主机计数构建的 var 上失败
- r - R中的循环管道运算符
- c++ - 如何避免指针超出范围的 C++ 分段错误(多态性)
- java - 如何在没有比较器的Java中使用MergeSort对对象数组进行排序
- javascript - 跨多个页面的多个 iframe 不同?
- sas - 在proc sql中按多个变量分组时为缺失值添加行