I am doing my first Swift UI project. I am having a form backed by a view-model (vm: SectionFormViewModel
). I found a neat solution to limit inputs to numbers in this SO answer.
struct SectionForm: View {
// @ObservedObject var homeVM: HomeViewModel
@StateObject var vm = SectionFormViewModel()
var body: some View {
// ....
}
var roomVolume: some View {
Section(header: Text("Room Dimensions")) {
if vm.manualArea {
HStack {
// Required to extract to component
// --------------------------------
TextField("Length (feet)", text: $vm.length)
//.keyboardType(.numberPad)
.onReceive(Just(vm.length)) { newValue in
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
vm.length = filtered
}
}
My idea was to create my own NumberField
. It would be called like this:
NumberField(label: "Length (feet)", binding: $vm.length)
But I can't figure out exactly how.
struct NumberField: View {
@Binding var binding: Binding<String>
var body: some View {
TextField("Length (feet)", text: binding)
//.keyboardType(.numberPad)
.onReceive(Just($binding.wrappedValue)) { newValue in
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
$binding.length = filtered
}
}
}
}
First of all, is it possible to do something like that?
I don't think it can be @State
because it is defined elsewhere. I think it should be a @Binding
. It might be an obvious thing, but after many searches, hours of teeth grinding, nail biting and hairline receding, I am confident I need some help.
Sorry about the title, I am not even sure how to word it. I am that new to Swift!