Ответ 1
На данный момент это не представляется возможным, но вы можете реализовать нечто подобное самостоятельно.
Вы можете создать собственное текстовое поле и добавить значение, чтобы оно стало первым респондентом.
struct CustomTextField: UIViewRepresentable {
class Coordinator: NSObject, UITextFieldDelegate {
@Binding var text: String
var didBecomeFirstResponder = false
init(text: Binding<String>) {
_text = text
}
func textFieldDidChangeSelection(_ textField: UITextField) {
text = textField.text ?? ""
}
}
@Binding var text: String
var isFirstResponder: Bool = false
func makeUIView(context: UIViewRepresentableContext<CustomTextField>) -> UITextField {
let textField = UITextField(frame: .zero)
textField.delegate = context.coordinator
return textField
}
func makeCoordinator() -> CustomTextField.Coordinator {
return Coordinator(text: $text)
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField>) {
uiView.text = text
if isFirstResponder && !context.coordinator.didBecomeFirstResponder {
uiView.becomeFirstResponder()
context.coordinator.didBecomeFirstResponder = true
}
}
}
Примечание. didBecomeFirstResponder
необходим, чтобы текстовое поле становилось первым респондентом только один раз, а не при каждом обновлении SwiftUI
!
Вы бы использовали это так...
struct ContentView : View {
@State var text: String = ""
var body: some View {
CustomTextField(text: $text, isFirstResponder: true)
.frame(width: 300, height: 50)
.background(Color.red)
}
}
P.S. Я добавил frame
, так как он не ведет себя как фондовый TextField
, что означает, что за кулисами происходит больше вещей.
Подробнее о Coordinators
в этом великолепном выступлении на WWDC 19:
Интеграция SwiftUI