Perpanjang Keyboard SwiftUI dengan Tombol Kustom

10

Saya mencoba menemukan cara untuk menambahkan kunci atau tombol ke numberPad SwiftUI. Satu-satunya referensi yang saya temukan mengatakan itu tidak mungkin. Di dunia Swift saya menambahkan toolbar dengan tombol untuk mengabaikan keyboard atau melakukan beberapa fungsi lainnya.

Saya bahkan akan membangun tampilan ZStack dengan tombol di atas tetapi saya tidak dapat menemukan cara untuk menambahkan numberPad ke tampilan saya sendiri.

Yang saya benar-benar coba lakukan dalam hal ini adalah mengabaikan numberPad ketika data dimasukkan. Saya pertama kali mencoba untuk memodifikasi SceneDelegate untuk mengabaikan keran, tetapi itu hanya berfungsi jika saya mengetuk tampilan teks atau bidang teks lain tidak di ruang terbuka pada tampilan.

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

Idealnya, saya akan menambahkan tombol Selesai ke ruang kiri bawah. Terbaik kedua tambahkan toolbar jika itu bisa dilakukan di SwiftUI.

masukkan deskripsi gambar di sini

Bimbingan apa pun akan dihargai.

Xcode Versi 11.2.1 (11B500)

user2698617
sumber

Jawaban:

6

Memecahkan masalah menggunakan protokol UIRPresentable

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

}

Menggunakan dalam tampilan konten

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
sumber
1
Saya berharap untuk solusi SwiftUI murni - tetapi saya pikir Anda benar - tidak ada satu pun.
user2698617
Lebih baik untuk mengimplementasikan koordinator yang dipasang oleh makeCoordinator()dan menggunakannya untuk target delegasi dan pemilih. Saya setuju dengan komentar-komentar lain, sepertinya belum ada solusi SwiftUI murni.
Bjørn Olav Ruud