Следующее оборачивает класс UITextField с именем UIKitTextField с использованием UIViewRepresentable. Тип клавиатуры установлен на .decimalPad, но может быть установлен любой допустимый тип клавиатуры.
// UIKitTextField.swift
import UIKit
class UIKitTextField: UITextField, UITextFieldDelegate {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
delegate = self
}
required override init(frame: CGRect) {
super.init(frame: frame)
delegate = self
self.setContentHuggingPriority(.defaultHigh, for: .vertical)
}
}
В ContentView.Swift я создал два TextFields. Первый - это UIKit UITextField, а второй - SwiftUI TextField. Привязка данных одинакова, поэтому каждый будет отображать один и тот же текст при вводе.
// ContentView.Swift
import SwiftUI
import UIKit
struct MyTextField : UIViewRepresentable {
@Binding var myText: String
func makeCoordinator() -> MyTextField.Coordinator {
return Coordinator(text: $myText)
}
class Coordinator: NSObject {
@Binding var text: String
init(text: Binding<String>) {
$text = text
}
@objc func textFieldEditingChanged(_ sender: UIKitTextField) {
self.text = sender.text ?? ""
}
}
func makeUIView(context: Context) -> UIKitTextField {
let myTextField = UIKitTextField(frame: .zero)
myTextField.addTarget(context.coordinator, action: #selector(Coordinator.textFieldEditingChanged(_:)), for: .editingChanged)
myTextField.text = self.myText
myTextField.placeholder = "placeholder"
myTextField.borderStyle = .roundedRect
myTextField.keyboardType = .decimalPad
return myTextField
}
func updateUIView(_ uiView: UIKitTextField,
context: Context) {
uiView.text = self.myText
}
}
struct MyTextFieldView: View {
@State var myText: String = "Test"
var body: some View {
VStack {
MyTextField(myText: $myText)
.padding()
TextField($myText)
.textFieldStyle(.roundedBorder)
.padding()
}
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
Group{
MyTextFieldView().previewLayout(.sizeThatFits)
MyTextFieldView().previewDevice("iPhone Xs")
}
}
}
#endif