Étendre le clavier SwiftUI avec un bouton personnalisé

10

J'essaie de trouver un moyen d'ajouter une clé ou un bouton au pavé numérique SwiftUI. Les seules références que j'ai trouvées disent que ce n'est pas possible. Dans le monde Swift, j'ai ajouté une barre d'outils avec un bouton pour fermer le clavier ou exécuter une autre fonction.

Je voudrais même créer une vue ZStack avec le bouton en haut, mais je ne trouve pas de moyen d'ajouter le pavé numérique à ma propre vue.

Tout ce que j'essaie vraiment de faire dans ce cas, c'est de rejeter le pavé numérique lorsque les données sont entrées. J'ai d'abord tenté de modifier le SceneDelegate pour qu'il disparaisse lors des tapotements, mais cela ne fonctionne que si je tapote dans un autre texte ou vue de champ de texte pas dans un espace ouvert de la vue.

window.rootViewController = UIHostingController(rootView: contentView.onTapGesture {
    window.endEditing(true)
})

Idéalement, j'ajouterais une touche Terminé à l'espace inférieur gauche. Deuxièmement, ajoutez une barre d'outils si cela peut être fait dans SwiftUI.

entrez la description de l'image ici

Tout conseil serait apprécié.

Xcode version 11.2.1 (11B500)

user2698617
la source

Réponses:

6

Résolu le problème en utilisant le protocole UIRepresentable

 struct TestTextfield: UIViewRepresentable {
    @Binding var text: String
    var keyType: UIKeyboardType
    func makeUIView(context: Context) -> UITextField {
        let textfield = UITextField()
      textfield.keyboardType = keyType
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: textfield.frame.size.width, height: 44))
        let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(textfield.doneButtonTapped(button:)))
        toolBar.items = [doneButton]
        toolBar.setItems([doneButton], animated: true)
        textfield.inputAccessoryView = toolBar
        return textfield
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        uiView.text = text

    }
}

extension  UITextField{
    @objc func doneButtonTapped(button:UIBarButtonItem) -> Void {
       self.resignFirstResponder()
    }

}

Utilisation dans l'affichage du contenu

struct ContentView : View {
@State var text = ""

var body: some View {
    TestTextfield(text: $text, keyType: UIKeyboardType.phonePad)
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 50)
        .overlay(
            RoundedRectangle(cornerRadius: 16)
                .stroke(Color.blue, lineWidth: 4)
    )
}

}

Rajeev Kumar S
la source
1
J'espérais une solution SwiftUI pure - mais je pense que vous avez raison - il n'y en a pas.
user2698617
Il est préférable d'implémenter un coordinateur instancié makeCoordinator()et de l'utiliser pour la délégation et la cible du sélecteur. Je suis d'accord avec les autres commentaires, il ne semble pas exister encore de solution SwiftUI pure.
Bjørn Olav Ruud