Erweitern Sie die SwiftUI-Tastatur mit der benutzerdefinierten Schaltfläche

10

Ich versuche einen Weg zu finden, um dem SwiftUI numberPad einen Schlüssel oder eine Schaltfläche hinzuzufügen. Die einzigen Referenzen, die ich gefunden habe, sagen, dass es nicht möglich ist. In der Swift-Welt habe ich eine Symbolleiste mit einer Schaltfläche hinzugefügt, um die Tastatur zu schließen oder eine andere Funktion auszuführen.

Ich würde sogar eine ZStack-Ansicht mit der Schaltfläche oben erstellen, aber ich kann keine Möglichkeit finden, das Nummernfeld zu meiner eigenen Ansicht hinzuzufügen.

Alles, was ich in diesem Fall wirklich versuche, ist, das Nummernfeld bei der Dateneingabe zu schließen. Ich habe zuerst versucht, das SceneDelegate so zu ändern, dass es beim Tippen geschlossen wird. Dies funktioniert jedoch nur, wenn ich auf eine andere Text- oder Textfeldansicht tippe, die sich nicht im offenen Bereich der Ansicht befindet.

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

Im Idealfall würde ich unten links eine Fertig-Taste hinzufügen. Fügen Sie am besten eine Symbolleiste hinzu, wenn dies in SwiftUI möglich ist.

Geben Sie hier die Bildbeschreibung ein

Jede Anleitung wäre dankbar.

Xcode Version 11.2.1 (11B500)

user2698617
quelle

Antworten:

6

Das Problem wurde mithilfe des UIRepresentable-Protokolls behoben

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

}

Verwendung in der Inhaltsansicht

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.
quelle
1
Ich hatte auf eine reine SwiftUI-Lösung gehofft - aber ich denke, Sie haben Recht - es gibt keine.
user2698617
Es ist besser, einen von ihm initiierten Koordinator zu implementieren makeCoordinator()und diesen für die Delegierung und das Auswahlziel zu verwenden. Ich stimme den anderen Kommentaren zu, es scheint noch keine reine SwiftUI-Lösung zu geben.
Bjørn Olav Ruud