SwiftUI TextField + Stepper

Я пытаюсь реализовать TextField с числовым вводом вместе с Stepper для контроля количества. После ввода числа в текстовое поле Степпер теряет возможность изменять число. Я почти уверен, что есть трюк со значением Binding, но не могу понять, что именно.

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
      })
    }
  }
}

person Owen Rivera    schedule 01.09.2020    source источник


Ответы (1)


Это связано с тем, что использование NumberFormatter в TextField ошибочно.

Вместо этого вам может потребоваться использовать настраиваемую привязку:

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
            })
        }
    }
}

Также не создавайте NumberFormatter каждый раз заново:

TextField("", value: $quantity, formatter: NumberFormatter())

Вы можете использовать статическое свойство, которое создается только один раз:

static let formatter = NumberFormatter()
person pawello2222    schedule 01.09.2020