我遇到的问题是十进制格式化程序(decimalFormatter)只有在文本字段(textField)触发提交事件(commit event),即按下回车键时才会触发并更新绑定。
因此,我想知道如何手动触发文本字段的提交事件?
以下格式化程序代码将接受任何数字,并确保它始终具有一个小数位(例如--10.5),如果插入了字母字符,则还原输入回到之前的有效输入,这正是我想要的。
import SwiftUI
import Combine
struct StandardRegimen: View {
@State private var totalDose = 6000.0
private var decimalFormatter: NumberFormatter = {
let f = NumberFormatter()
f.isLenient = true
f.numberStyle = .none
f.maximumFractionDigits = 1
f.minimumFractionDigits = 1
f.alwaysShowsDecimalSeparator = true
return f
}()
var body: some View{
return
VStack(alignment:.center,spacing:10){
TextField("?", value:$totalDose, formatter: self.decimalFormatter, onCommit: {
print("COMMITED!");
}).font(.system(size: 25.0))
.textFieldStyle(RoundedBorderTextFieldStyle())
.keyboardType(.decimalPad)
}
}
如果您删除修改器代码.keyboardType(.decimalPad)
并在键盘上按回车键,它将触发COMMITED消息并关闭键盘。
然而,如果您保留小数点修改器,则没有办法触发提交,因为小数点没有返回键。
我在这里写了一个答案,解释如何通过点击开放空间区域来让键盘消失(How to hide keyboard when using SwiftUI?)
我研究过使用绑定到字符串和使用文本字段的text
初始化参数而不是值的其他解决方案,因为这将与绑定值正常工作,但这会导致一些非常奇怪的结果,因为它在每次按键时更新(例如——用户很难输入和编辑错误),而我希望它仅在提交后运行格式化程序,我想在用户点击以关闭键盘时进行提交,因为在小数键盘上我没有返回键选项。
欢迎提供任何有关解决此问题的方法。