使iOS SwiftUI文本字段拒绝错误的数字输入
我的iOS SwiftUI允许用户输入一个Int。如果用户键入错误的输入字符,例如“abc”而不是“123”,我希望在我的文本中显示错误消息中的错误字符(我在其中写入textField.Text),并且我希望将textField的键盘保持在屏幕上,直到用户提供正确的输入。如何做到这一点?先谢谢你。macOS Catalina 10.15.6上的Xcode 11.6使iOS SwiftUI文本字段拒绝错误的数字输入,ios,swiftui,textfield,Ios,Swiftui,Textfield,我的iOS SwiftUI允许用户输入一个Int。如果用户键入错误的输入字符,例如“abc”而不是“123”,我希望在我的文本中显示错误消息中的错误字符(我在其中写入textField.Text),并且我希望将textField的键盘保持在屏幕上,直到用户提供正确的输入。如何做到这一点?先谢谢你。macOS Catalina 10.15.6上的Xcode 11.6 struct ContentView: View { @State private var value: Int? = ni
struct ContentView: View {
@State private var value: Int? = nil;
@State private var text: String = "";
var body: some View {
VStack {
TextField(
"Enter an integer:",
value: $value,
formatter: NumberFormatter(),
onCommit: {
guard let value: Int = self.value else {
self.text = "Bad input \"\(textField.text)\".";
//Do not dismiss the TextField's keyboard.
return;
}
//Dismiss the TextField's keyboard.
self.text = "The product is \(2 * value).";
}
)
.keyboardType(.numbersAndPunctuation)
.textFieldStyle(RoundedBorderTextFieldStyle())
Text(text)
}
.padding([.leading, .trailing], 16)
}
}
下面的代码为您提供了在用户键入时验证文本字段中文本的方法
struct ContentView: View {
@State private var textNumber : String = ""
@State private var isNumberValid : Bool = true
var body: some View {
VStack {
TextField("Enter an integer:", text: numberValidator())
.keyboardType(.numbersAndPunctuation)
.textFieldStyle(RoundedBorderTextFieldStyle())
if !self.isNumberValid {
Text("Bad input \"\(textNumber)\".")
.font(.callout)
.foregroundColor(Color.red)
}
}
.padding([.leading, .trailing], 16)
}
private func numberValidator() -> Binding<String> {
return Binding<String>(
get: {
return self.textNumber
}) {
if CharacterSet(charactersIn: "1234567890").isSuperset(of: CharacterSet(charactersIn: $0)) {
self.textNumber = $0
self.isNumberValid = true
} else {
self.textNumber = $0
//self.textNumber = ""
self.isNumberValid = false
}
}
}
}
struct ContentView:View{
@国家私有变量textNumber:String=“”
@国家私有变量isNumberValid:Bool=true
var body:一些观点{
VStack{
TextField(“输入整数:”,text:numberValidator())
.键盘类型(.numbers和标点符号)
.textFieldStyle(RoundedBorderTextFieldStyle())
如果!self.isNumberValid{
文本(“错误输入\”(文本编号)\”)
.font(.callout)
.foregroundColor(颜色:红色)
}
}
.padding([.前导,.尾随],16)
}
私有函数numberValidator()->绑定{
返回绑定(
获取:{
返回self.textNumber
}) {
if CharacterSet(charactersIn:“1234567890”).issupertet(of:CharacterSet(charactersIn:$0)){
self.textNumber=$0
self.isNumberValid=true
}否则{
self.textNumber=$0
//self.textNumber=“”
self.isNumberValid=false
}
}
}
}
以下代码片段为您提供了在用户使用Get,Setvalue键入时验证文本字段中文本的方法
let checkValue = Binding<String>(
get: {
self.value
},
set: {
self.value = $0
}
)
let checkValue=Binding(
获取:{
自我价值
},
设置:{
self.value=$0
}
)
我希望它能对你有所帮助
struct ContentView: View {
@State private var value: String = ""
@State private var text: String = ""
var body: some View {
let checkValue = Binding<String>(
get: {
self.value
},
set: {
self.value = $0
}
)
return VStack {
TextField("Enter an integer:",text: checkValue)
.keyboardType(.numbersAndPunctuation)
.textFieldStyle(RoundedBorderTextFieldStyle())
Text("Bad interger: \(Int(self.value) != nil ? "" : self.value)").foregroundColor(Color.red)
}
.padding([.leading, .trailing], 16)
}
}
struct ContentView:View{
@国家私有变量值:String=“”
@国家私有变量文本:String=“”
var body:一些观点{
让checkValue=Binding(
获取:{
自我价值
},
设置:{
self.value=$0
}
)
返回VStack{
TextField(“输入整数:”,文本:checkValue)
.键盘类型(.numbers和标点符号)
.textFieldStyle(RoundedBorderTextFieldStyle())
文本(“坏整数:\(Int(self.value)!=nil?”:self.value)”).foregroundColor(Color.red)
}
.padding([.前导,.尾随],16)
}
}
TextField目前无法实现此类功能。您需要在UITextField上使用representable。