Extienda el teclado SwiftUI con botón personalizado

10

Estoy tratando de encontrar una manera de agregar una tecla o botón al SwiftUI numberPad. Las únicas referencias que he encontrado dicen que no es posible. En el mundo Swift agregué una barra de herramientas con un botón para descartar el teclado o realizar alguna otra función.

Incluso construiría una vista de ZStack con el botón en la parte superior, pero no puedo encontrar una manera de agregar el numberPad a mi propia vista.

Todo lo que realmente estoy tratando de hacer en este caso es descartar el número Pad cuando se ingresan los datos. Primero intenté modificar SceneDelegate para descartar en toques, pero eso solo funciona si toco en otro texto o vista de campo de texto que no esté en el espacio abierto de la vista.

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

Idealmente, agregaría una tecla Listo al espacio inferior izquierdo. En segundo lugar, agregue una barra de herramientas si se puede hacer en SwiftUI.

ingrese la descripción de la imagen aquí

Cualquier orientación sería apreciada.

Xcode versión 11.2.1 (11B500)

usuario2698617
fuente

Respuestas:

6

Resolvió el problema usando el protocolo representable UIR

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

}

Usar en la vista de contenido

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
fuente
1
Esperaba una solución pura de SwiftUI, pero creo que tienes razón, no hay una.
user2698617
Es mejor implementar un coordinador instanciado makeCoordinator()y usarlo para la delegación y el objetivo del selector. Estoy de acuerdo con los otros comentarios, todavía no parece existir una solución SwiftUI pura.
Bjørn Olav Ruud