web-dev-qa-db-fra.com

SwiftUI - Comment naviguer dans TextFields en cliquant sur le bouton de retour du clavier?

Je travaille avec SwiftUI TextField View. J'ai principalement 2 questions,

1) Dans Swift, nous pouvons définir Touche Retour (Traits de saisie de texte) sur Next pour TextField à partir du storyboard comme ce droit? Pour cela, quel modificateur utiliser dans SwiftUI?

enter image description here

2) J'ai deux champs de texte, comment naviguer vers le prochain champ de texte lorsque je clique sur le bouton retour/suivant du clavier?

Quelqu'un peut-il aider avec cette solution ou toute autre alternative pour exécuter cette fonctionnalité?

Ma question concerne SwiftUI et non UIKit :)

Toute aide serait très appréciée!!

11
Anjali Kevadiya

Pour résoudre vos deux problèmes, vous devez travailler avec UIKit à partir de SwiftUI . Tout d'abord, vous devez personnaliser TextField en utilisant UIViewRepresentable . Voici l'exemple de code à des fins de test, bien que le code ne soit pas si élégant. Je parie qu'il y aura une solution plus robuste.

  1. Dans le TextFieldType personnalisé, le type de retour du clavier a été défini.
  2. En utilisant la liaison d'objet et les méthodes déléguées textFieldShouldReturn , View peut concentrer le clavier en mettant à jour les variables de liaison.

Voici l exemple de code:

import SwiftUI

struct KeyboardTypeView: View {
    @State var firstName = ""
    @State var lastName = ""
    @State var focused: [Bool] = [true, false]

    var body: some View {
        Form {
            Section(header: Text("Your Info")) {
                TextFieldTyped(keyboardType: .default, returnVal: .next, tag: 0, text: self.$firstName, isfocusAble: self.$focused)
                TextFieldTyped(keyboardType: .default, returnVal: .done, tag: 1, text: self.$lastName, isfocusAble: self.$focused)
                Text("Full Name :" + self.firstName + " " + self.lastName)
            }
        }
}
}



struct TextFieldTyped: UIViewRepresentable {
    let keyboardType: UIKeyboardType
    let returnVal: UIReturnKeyType
    let tag: Int
    @Binding var text: String
    @Binding var isfocusAble: [Bool]

    func makeUIView(context: Context) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.keyboardType = self.keyboardType
        textField.returnKeyType = self.returnVal
        textField.tag = self.tag
        textField.delegate = context.coordinator
        textField.autocorrectionType = .no

        return textField
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        if isfocusAble[tag] {
            uiView.becomeFirstResponder()
        } else {
            uiView.resignFirstResponder()
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: TextFieldTyped

        init(_ textField: TextFieldTyped) {
            self.parent = textField
        }

        func updatefocus(textfield: UITextField) {
            textfield.becomeFirstResponder()
        }

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

            if parent.tag == 0 {
                parent.isfocusAble = [false, true]
                parent.text = textField.text ?? ""
            } else if parent.tag == 1 {
                parent.isfocusAble = [false, false]
                parent.text = textField.text ?? ""
         }
        return true
        }

    }
}

Production: enter image description here

9
Razib Mollick

Vous ne pouvez pas, il n'y a pas encore de concept de chaîne de répondeur dans SwiftUI. Vous ne pouvez pas initier par programme le focus sur un View car ce ne sont pas réellement les vues elles-mêmes, simplement des structures qui décrivent comment les vues doivent être configurées. Je suppose qu'il peut éventuellement être exposé via EnvironmentValues (comme la troncature de ligne, la correction automatique, etc.) mais il n'existe pas actuellement.

0
Procrastin8