Rozszerz klawiaturę SwiftUI o przycisk niestandardowy

10

Próbuję znaleźć sposób, aby dodać klucz lub przycisk do SwiftUI numberPad. Jedyne znalezione przeze mnie referencje mówią, że nie jest to możliwe. W świecie Swift dodałem pasek narzędzi z przyciskiem, aby zwolnić klawiaturę lub wykonać inną funkcję.

Zbudowałbym nawet widok ZStack z przyciskiem na górze, ale nie mogę znaleźć sposobu, aby dodać numerPada do mojego własnego widoku.

Jedyne, co naprawdę próbuję zrobić w tym przypadku, to usunąć numerPad po wprowadzeniu danych. Najpierw próbowałem zmodyfikować SceneDelegate, aby odrzucić po dotknięciach, ale działa to tylko wtedy, gdy dotknę innego widoku tekstowego lub pola tekstowego, a nie na otwartej przestrzeni w widoku.

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

Idealnie dodałbym klawisz Gotowe w lewym dolnym miejscu. Po drugie najlepiej dodać pasek narzędzi, jeśli można to zrobić w SwiftUI.

wprowadź opis zdjęcia tutaj

Wszelkie wskazówki będą mile widziane.

Wersja Xcode 11.2.1 (11B500)

użytkownik2698617
źródło

Odpowiedzi:

6

Rozwiązano problem za pomocą protokołu 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()
    }

}

Używanie w widoku zawartości

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.
źródło
1
Miałem nadzieję na czyste rozwiązanie SwiftUI - ale myślę, że masz rację - nie ma jednego.
user2698617
Lepiej wdrożyć koordynatora instancyjnego makeCoordinator()i użyć go do delegowania i wyboru celu. Zgadzam się z innymi komentarzami, wydaje się, że nie ma jeszcze czystego rozwiązania SwiftUI.
Bjørn Olav Ruud