SwiftUI:如何使TextField成为第一响应者?

16 浏览
0 Comments

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日
0
0 Comments

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 上测试通过

0
0 Comments

通过使用SwiftUI-Introspect,您可以进行以下操作:

TextField("", text: $value)
.introspectTextField { textField in
    textField.becomeFirstResponder()
}

0