目前似乎还不太可能,但是您可以自己实现类似的功能。
您可以创建一个自定义文本字段并添加一个值,使其成为第一响应者。
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) }}
PS我添加了一个,
frame因为它的行为不像股票
TextField,这意味着在幕后还有更多的事情要做。
更多关于
Coordinators在这个优秀的WWDC 19讲:
整合SwiftUI
在Xpre 11.4上测试
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)