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")
}
}
}
}
我想要的是当文本字段变为 可见时 ,使文本字段成为第一响应者(即获得焦点并弹出键盘)。
回答:
目前似乎还不太可能,但是您可以自己实现类似的功能。
您可以创建一个自定义文本字段并添加一个值,使其成为第一响应者。
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
以上是 SwiftUI:如何使TextField成为第一响应者? 的全部内容, 来源链接: utcz.com/qa/429706.html