这是我的SwiftUI代码:
SwiftUI
struct ContentView : View { @State var showingTextField = false @State var text = "" var body: some View { return VStack { if showingTextField { TextField($text) } Button(action: { self.showingTextField.toggle() }) { Text ("Show") } } } }
我想要的是当文本字段变为 可见时 ,使文本字段成为第一响应者(即获得焦点并弹出键盘)。
目前似乎还不太可能,但是您可以自己实现类似的功能。
您可以创建一个自定义文本字段并添加一个值,使其成为第一响应者。
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!
didBecomeFirstResponder
您将像这样使用它…
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,这意味着在幕后还有更多的事情要做。
frame
TextField
更多关于Coordinators在这个优秀的WWDC 19讲: 整合SwiftUI
Coordinators
在Xcode 11.4上测试