J'utilise Swift-UI pour créer mon application. Il existe un AccountView
répertorie les attributs de l'utilisateur et vous pouvez le mettre à jour.
Une fois que vous avez cliqué sur un bouton Update
sur la ligne de variables de l'utilisateur de la liste, accédez à EditVariableView
, où vous pouvez modifier la variable avec le Text Field
.
Bien sûr, le champ de texte a une validation du texte entré, et vous pouvez valider la modification par le bouton Submit
dans le coin supérieur droit de EditVariableView
.
Pour la validation de l'entrée, j'utilise onCommit
, détectant le changement de l'entrée, mais voici un problème.
Lorsque vous touchez le champ de texte, le clavier sort et vous pouvez également saisir le texte. Mais onCommit
émet un événement uniquement lorsque vous fermez le clavier.
Si vous saisissez le texte et cliquez sur le bouton Submit
sans fermer le clavier, onCommit
n'émet certainement pas d'événement pour la validation. Donc, bien sûr, la validation ne sera pas effectuée.
Je veux que vous me disiez comment détecter le changement d'entrée à chaque changement de texte.
3 Réponses :
Vous pouvez désactiver le bouton Soumettre si TextField est en état d'édition
import SwiftUI struct ContentView: View { @State var txt: String = "" @State var editingFlag = false var body: some View { VStack { TextField("text", text: $txt, onEditingChanged: { (editing) in self.editingFlag = editing }) { print("commit") }.padding().border(Color.red) Button(action: { print("submit") }) { Text("SUBMIT") }.disabled(editingFlag) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Avec le Xcode 12 et depuis iOS 14, macOS 11 ou tout autre système d'exploitation contient SwiftUI 2.0, il existe un nouveau modificateur appelé `` onChange '' qui détecte tout changement d' state
donné et peut être effectué sur n'importe quelle vue. Donc, avec quelques refactorisations mineures:
struct ContentView: View { @State var txt: String = "" @State var editingFlag = false var body: some View { VStack { TextField("text", text: $txt) .onChange(of: txt) { print("Changed to :\($0)") } } .padding() .border(Color.red) Button("SUBMIT") { print("submit") } .disabled(editingFlag) } }
de: piratage avec Swift. Paul Hudson
struct ContentView : View { @State private var name = "" var body: some View { TextField("Enter your name:", text: $name) .textFieldStyle(RoundedBorderTextFieldStyle()) .onChange(of: name) { newValue in print("Name changed to \(name)!") } } }