整数的文本字段 [英] TextField for integer

查看:30
本文介绍了整数的文本字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用写一个表单,带有一个要求用户输入数字的文本字段.但是,我发现即使用户将数字从 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆