SwiftUI:如何使TextField成为第一响应者?
SwiftUI:如何使TextField成为第一响应者?
这是我的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") } } } }
我想要的是当文本框变为可见时,使文本框成为第一响应者(即接收焦点并弹出键盘)。
admin 更改状态以发布 2023年5月21日
Swift UI 3
从 Xcode 13 开始,您可以使用 focused
修饰符,使视图成为第一响应者。
Swift UI 1/2
目前似乎不可能,但是您可以自己实现类似的功能。
您可以创建一个自定义文本字段,添加一个值使其成为第一响应者。
struct CustomTextField: UIViewRepresentable { class Coordinator: NSObject, UITextFieldDelegate { @Binding var text: String var didBecomeFirstResponder = false init(text: Binding) { _text = text } func textFieldDidChangeSelection(_ textField: UITextField) { text = textField.text ?? "" } } @Binding var text: String var isFirstResponder: Bool = false func makeUIView(context: UIViewRepresentableContext ) -> 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 ) { 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) } }
顺便说一句,我添加了一个 frame
,因为它的行为不像默认的 TextField
,这意味着背后还有更多的东西。
有关协调器
的更多信息,请参见这个精彩的 WWDC 19 演讲:
集成 SwiftUI
在 Xcode 11.4 上测试通过
通过使用SwiftUI-Introspect,您可以进行以下操作:
TextField("", text: $value) .introspectTextField { textField in textField.becomeFirstResponder() }