ขยายแป้นพิมพ์ SwiftUI ด้วยปุ่มกำหนดเอง


10

ฉันกำลังพยายามหาวิธีเพิ่มคีย์หรือปุ่มในหมายเลข SwiftUI การอ้างอิงเดียวที่ฉันพบพบว่ามันเป็นไปไม่ได้ ในโลก Swift ฉันเพิ่มแถบเครื่องมือพร้อมปุ่มเพื่อยกเลิกคีย์บอร์ดหรือใช้งานฟังก์ชั่นอื่น

ฉันจะสร้างมุมมอง ZStack ด้วยปุ่มที่อยู่ด้านบน แต่ฉันไม่สามารถหาวิธีเพิ่ม numberPad ในมุมมองของฉันเองได้

ทั้งหมดที่ฉันพยายามทำในกรณีนี้คือการยกเลิกหมายเลขบนหน้าจอเมื่อป้อนข้อมูล ก่อนอื่นฉันพยายามแก้ไข SceneDelegate ให้เลิกใช้ก๊อกน้ำ แต่ใช้ได้เฉพาะเมื่อฉันแตะที่มุมมองข้อความหรือฟิลด์ข้อความอื่นไม่ใช่ในพื้นที่เปิดโล่งในมุมมอง

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

โดยหลักแล้วฉันจะเพิ่มปุ่ม Done ที่ช่องว่างด้านล่างซ้าย อันดับที่สองควรเพิ่มแถบเครื่องมือถ้าสามารถทำได้ใน SwiftUI

ป้อนคำอธิบายรูปภาพที่นี่

คำแนะนำใด ๆ ที่จะได้รับการชื่นชม

Xcode เวอร์ชั่น 11.2.1 (11B500)

คำตอบ:


6

แก้ไขปัญหาโดยใช้โปรโตคอล 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()
    }

}

ใช้ในมุมมองเนื้อหา

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
ฉันหวังว่าจะได้โซลูชัน SwiftUI ที่บริสุทธิ์ - แต่ฉันคิดว่าคุณถูกต้อง - ไม่มีเลย
user2698617

มันจะดีกว่าที่จะใช้ผู้ประสานงานโดยmakeCoordinator()ใช้และใช้สำหรับการมอบหมายและเลือกเป้าหมาย ฉันเห็นด้วยกับความคิดเห็นอื่น ๆ ดูเหมือนจะยังไม่มีโซลูชัน SwiftUI ที่แท้จริง
Bjørn Olav Ruud
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.