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

回到顶部