Estenda o teclado SwiftUI com botão personalizado

10

Estou tentando encontrar uma maneira de adicionar uma chave ou botão ao numberPad do SwiftUI. As únicas referências que encontrei dizem que não é possível. No mundo Swift, adicionei uma barra de ferramentas com um botão para descartar o teclado ou executar alguma outra função.

Eu até criaria uma exibição do ZStack com o botão na parte superior, mas não consigo encontrar uma maneira de adicionar o numberPad à minha própria exibição.

Tudo o que realmente estou tentando fazer neste caso é descartar o numberPad quando os dados são inseridos. Primeiro tentei modificar o SceneDelegate para dispensar as torneiras, mas isso só funciona se eu tocar em outra exibição de texto ou campo de texto que não esteja no espaço aberto da exibição.

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

Idealmente, eu adicionaria uma tecla Concluído ao espaço inferior esquerdo. Segundo melhor, adicione uma barra de ferramentas, se isso puder ser feito no SwiftUI.

insira a descrição da imagem aqui

Qualquer orientação seria apreciada.

Xcode versão 11.2.1 (11B500)

user2698617
fonte

Respostas:

6

Resolvido o problema usando o protocolo 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()
    }

}

Usando na exibição de conteúdo

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
fonte
11
Eu estava esperando uma solução SwiftUI pura - mas acho que você está correto - não há uma.
user2698617
É melhor implementar um coordenador instanciado por makeCoordinator()e usá-lo para delegação e destino de seletor. Concordo com os outros comentários, ainda não parece existir uma solução SwiftUI pura.
Bjørn Olav Ruud