0
votes

Swiftui: comment regarder toujours la variable liée au champ de texte

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.


0 commentaires

3 Réponses :


2
votes

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


0 commentaires

0
votes

SwiftUI 2.0

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


0 commentaires

0
votes

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


0 commentaires