How to detect live changes on TextField in SwiftUI? How to detect live changes on TextField in SwiftUI? ios ios

How to detect live changes on TextField in SwiftUI?


You can create a binding with a custom closure, like this:

struct ContentView: View {    @State var location: String = ""    var body: some View {        let binding = Binding<String>(get: {            self.location        }, set: {            self.location = $0            // do whatever you want here        })        return VStack {            Text("Current location: \(location)")            TextField("Search Location", text: binding)        }    }}


SwiftUI 2.0

From iOS 14, macOS 11, or any other OS contains SwiftUI 2.0, there is a new modifier called .onChange that detects any change of the given state:

struct ContentView: View {    @State var location: String = ""    var body: some View {        TextField("Your Location", text: $location)            .onChange(of: location) {                print($0) // You can do anything due to the change here.                // self.autocomplete($0) // like this            }    }}

SwiftUI 1.0

For older iOS and other SwiftUI 1.0 platforms, you can use onReceive:

.onReceive(location.publisher) {     print($0)}

Note that it returns the change instead of the entire value. If you need the behavior the same as the onChange, you can use the combine and follow the answer provided by @pawello2222.


Another solution, if you need to work with a ViewModel, could be:

import SwiftUIimport Combineclass ViewModel: ObservableObject {    @Published var location = "" {        didSet {            print("set")            //do whatever you want        }    }}struct ContentView: View {    @ObservedObject var viewModel = ViewModel()    var body: some View {        TextField("Search Location", text: $viewModel.location)    }}