Изменить значение текста при одновременном наборе текста в TextField, нигде не щелкая - SwiftUI - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь изменить значение Текст при наборе TextField .Когда я набираю что-нибудь в TextField, я хочу сделать некоторые вычисления со значением Textfield и отобразить его в Text.В Swift у нас есть func textFieldDidChange(_ textField: UITextField) метод делегата UITextField для отслеживания изменения UITextField.

В SwiftUI я пытался создать TextField с onEditingChanged.но почему-то это не входит в этот блок.Я не знаю, делаю ли я что-то не так с этим или нет.

    @State var totalAmount: String = ""
    @State var addAmount: String = ""
    var body: some View {

            HStack {
                TextField("0.0", text: $totalAmount, onEditingChanged: { _ in
                    self.addAmount = //doing some calculation with totalAmount
                })
                Text(self.addAmount)

            }
    }

Может кто-нибудь помочь с этим?

1 Ответ

4 голосов
/ 27 сентября 2019

SwiftUI не похож на Какао.Он не управляется событиями, и нет связи от одного объекта интерфейса к другому.Есть только данные .Потоки данных через переменные состояния .Он вверх по привязке переменной состояния и вниз по значению переменной состояния .

Так что вы неТебе нужно событие onEditingChanged или любое другое событие.$totalAmount является привязкой .Он изменяется при изменении текста текстового поля: автоматически .

Более того, totalAmount - это переменная состояния . Если текст использует это в качестве своего значения, прямо или косвенно, текст изменяется автоматически при изменении totalAmount,

Так что просто используйте вычисляемую переменную, которая зависит от totalAmount, и установите значение Text, и все готово.

Очень простой пример:

struct ContentView : View {
    @State var totalAmount = ""
    let addAmount = 10.0 // or whatever
    var calc : Double { (Double(totalAmount) ?? 0.0) + addAmount } // or whatever
    var body: some View {
        HStack {
            TextField("Type a number", text: $totalAmount)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .frame(width:100)
            Text(String(self.calc))
        }
    }
}
...