SwiftUI 文本字段 + 步进器

Owe*_*era 3 textfield ios swift stepper swiftui

我正在尝试实现一个带有数字输入的 TextField 以及 Stepper 来控制数量。在文本字段中输入数字后,步进器将失去更改数字的能力。我很确定绑定值有一个技巧,但无法弄清楚到底是什么。

struct TestView: View {
  @State var quantity: Int = 0

  var body: some View {
    HStack {
      TextField("", value: $quantity, formatter: NumberFormatter())
      Stepper("", onIncrement: {
        self.quantity += 1
      }, onDecrement: {
        self.quantity -= 1
      })
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

paw*_*222 5

这是因为使用NumberFormatterinTextField有问题的

您可能需要使用自定义绑定:

struct ContentView: View {
    @State var quantity: Int = 0

    static let formatter = NumberFormatter()

    var binding: Binding<String> {
        .init(get: {
            "\(self.quantity)"
        }, set: {
            self.quantity = Int($0) ?? self.quantity
        })
    }

    var body: some View {
        HStack {
            TextField("", text: binding)
            Stepper("", onIncrement: {
                self.quantity += 1
            }, onDecrement: {
                self.quantity -= 1
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

也不要NumberFormatter每次都重新创建:

TextField("", value: $quantity, formatter: NumberFormatter())
Run Code Online (Sandbox Code Playgroud)

您可以使用仅创建一次的静态属性:

static let formatter = NumberFormatter()
Run Code Online (Sandbox Code Playgroud)