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

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

}


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.