Estendi la tastiera SwiftUI con il pulsante personalizzato


10

Sto cercando di trovare un modo per aggiungere una chiave o un pulsante al numeroPad SwiftUI. Le uniche referenze che ho trovato dicono che non è possibile. Nel mondo Swift ho aggiunto una barra degli strumenti con un pulsante per chiudere la tastiera o eseguire altre funzioni.

Costruirò persino una vista ZStack con il pulsante in alto ma non riesco a trovare un modo per aggiungere il numeroPad alla mia vista.

Tutto ciò che sto davvero cercando di fare in questo caso è di eliminare il numeroPad quando vengono inseriti i dati. Ho tentato prima di modificare SceneDelegate per ignorare i tocchi, ma funziona solo se tocco in un'altra vista di testo o di campo di testo non nello spazio aperto della vista.

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

Idealmente, aggiungerei una chiave Fine nello spazio in basso a sinistra. In secondo luogo, aggiungere una barra degli strumenti se è possibile farlo in SwiftUI.

inserisci qui la descrizione dell'immagine

Qualsiasi consiglio sarebbe apprezzato.

Xcode versione 11.2.1 (11B500)

Risposte:


6

Risolto il problema usando il protocollo 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 nella vista contenuto

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
Speravo in una soluzione SwiftUI pura - ma penso che tu abbia ragione - non ce n'è una.
user2698617

È meglio implementare un coordinatore istanziato da makeCoordinator()e usarlo per la delegazione e l'obiettivo del selettore. Concordo con gli altri commenti, sembra che non esista ancora una soluzione SwiftUI pura.
Bjørn Olav Ruud,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.