web-dev-qa-db-fra.com

Comment détecter les changements en direct sur TextField dans SwiftUI?

J'ai un simple TextField qui se lie à l'état "emplacement" comme ceci,

TextField("Search Location", text: $location)

Je veux appeler une fonction à chaque fois que ce champ change, quelque chose comme ceci:

TextField("Search Location", text: $location) {
   self.autocomplete(location)
}

Mais cela ne fonctionne pas. Je sais qu'il existe des rappels, onEditingChanged - mais cela ne semble être déclenché que lorsque le champ est focalisé.

Comment puis-je appeler cette fonction à chaque mise à jour du champ?

14
dylankbuckley

Vous pouvez créer une reliure avec une fermeture personnalisée, comme ceci:

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

    }
}
25
kontiki

Une autre solution, si vous devez travailler avec un ViewModel, pourrait être:

import SwiftUI
import Combine

class 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)
    }
}
12
superpuccio

Ce que j'ai trouvé le plus utile, c'est que TextField possède une propriété appelée onEditingChanged, qui est appelée au début de l'édition et à la fin de l'édition.

               TextField("Enter song title", text: self.$userData.songs[self.songIndex].name, onEditingChanged: { (changed) in
               if changed {
                   print("text edit has begun")
               } else {
                   print("committed the change")
                   saveSongs(self.userData.songs)
               }

           }).textFieldStyle(RoundedBorderTextFieldStyle())
               .font(.largeTitle)
1
Dave Levy