Mở rộng bàn phím SwiftUI với nút tùy chỉnh


10

Tôi đang cố gắng tìm cách thêm một phím hoặc nút vào số bàn phím SwiftUI. Các tài liệu tham khảo duy nhất tôi đã tìm thấy nói rằng nó là không thể. Trong thế giới Swift, tôi đã thêm một thanh công cụ với một nút để tắt bàn phím hoặc thực hiện một số chức năng khác.

Tôi thậm chí sẽ xây dựng chế độ xem ZStack bằng nút ở trên nhưng tôi không thể tìm cách thêm numberPad vào chế độ xem của riêng mình.

Tất cả những gì tôi thực sự cố gắng thực hiện trong trường hợp này là loại bỏ numberPad khi dữ liệu được nhập. Trước tiên tôi đã cố gắng sửa đổi SceneDelegate để loại bỏ các vòi, nhưng điều đó chỉ hoạt động nếu tôi nhấn vào một chế độ xem văn bản hoặc trường văn bản khác không trong không gian mở trên chế độ xem.

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

Lý tưởng nhất là tôi thêm khóa Xong vào khoảng trống bên trái. Thứ hai tốt nhất thêm một thanh công cụ nếu nó có thể được thực hiện trong SwiftUI.

nhập mô tả hình ảnh ở đây

Bất kỳ hướng dẫn sẽ được đánh giá cao.

Phiên bản Xcode 11.2.1 (11B500)

Câu trả lời:


6

Đã giải quyết vấn đề bằng giao thức có thể xuất hiện

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

}

Sử dụng trong chế độ xem nội dung

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
Tôi đã hy vọng về một giải pháp SwiftUI thuần túy - nhưng tôi nghĩ bạn đã đúng - không có giải pháp nào cả.
dùng2698617

Tốt hơn là thực hiện một điều phối viên được kích hoạt bởi makeCoordinator()và sử dụng điều đó cho mục tiêu ủy nhiệm và chọn. Tôi đồng ý với các ý kiến ​​khác, dường như chưa tồn tại một giải pháp SwiftUI thuần túy nào.
Bjørn Olav Ruud
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.