整数的文本字段 [英] TextField for integer
本文介绍了整数的文本字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试使用写一个表单,带有一个要求用户输入数字的文本字段.但是,我发现即使用户将数字从 0 更改为另一个值,例如 10
I have tried to use the write a form, with a textfield that ask user to input the number. However, I found that it is always 0 even if the user has changed the number from 0 to another value, say 10
struct AddRecordView: View {
@State private var age = 0
var body: some View {
Form {
Section {
HStack {
Text("Age")
Spacer()
TextField("age", value: $age, formatter: NumberFormatter()).multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
}
}.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Add") {
print("\(self.age)") // always 0 here?
}
}
}
推荐答案
不要使用数字格式化程序,只需使用 Binding
来获取和设置您的年龄值:
Instead of using a number formatter just use a Binding
to get and set your age value:
TextField("age", text: Binding(get: { String(age) }, set: { age = Int($0) ?? 0 }))
.keyboardType(.numberPad)
如果您只想在文本字段中接受整数并限制年龄范围,则需要实现文本绑定管理器来控制文本字段内容:
If you would like to accept only integers in your text field and limit the age range you would need to implement a text binding manager to control the text field content:
class TextBindingManager: ObservableObject {
@Published var string: String = ""
init(string: String) { self.string = string }
}
import SwiftUI
struct ContentView: View {
@ObservedObject private var bindingManager = TextBindingManager(string: "")
@State private var ageString = ""
@State private var age = 0
private let range = 1...123 // you can restrict the age range here
var body: some View {
NavigationView {
Form {
Section {
HStack {
Text("Age")
Spacer()
TextField("age", text: $bindingManager.string)
.keyboardType(.numberPad)
.onChange(of: bindingManager.string) { newValue in
guard !bindingManager.string.isEmpty else {
age = 0
return
}
bindingManager.string.removeAll(where: \.isDigit.negated)
guard let newValue = Int(bindingManager.string),
range ~= newValue
else {
if let digit = bindingManager.string.last?.wholeNumberValue {
age = digit
bindingManager.string = String(digit)
ageString = bindingManager.string
return
}
bindingManager.string = ageString
ageString = bindingManager.string
return
}
age = newValue
bindingManager.string = String(newValue)
ageString = bindingManager.string
}
}
}
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Add") {
print(age)
}
.disabled(!(range ~= age))
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
extension Character {
var isDigit: Bool { "0"..."9" ~= self }
}
extension Bool {
var negated: Bool { !self }
}
这篇关于整数的文本字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文