web-dev-qa-db-fra.com

Étendre le clavier SwiftUI avec un bouton personnalisé

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 effectuer une autre fonction.

Je voudrais même créer une vue ZStack avec le bouton en haut, mais je ne trouve pas un 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. En second lieu, ajoutez une barre d'outils si cela peut être fait dans SwiftUI.

enter image description here

Tout conseil serait apprécié.

Xcode version 11.2.1 (11B500)

9
user2698617

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

}

3
Rajeev Kumar S