当前位置: 首页 > 面试题库 >

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

陈和裕
2023-03-14
问题内容

这是我的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

在Xcode 11.4上测试



 类似资料:
  • SwiftUI 文本字段可以与可选绑定一起使用吗?当前此代码: 产生以下错误: 无法转换“Binding”类型的值 有什么办法解决这个问题吗?在数据模型中使用选项是一种非常常见的模式——事实上,这是核心数据中的默认模式,所以SwiftUI不支持它们似乎很奇怪

  • 问题内容: 我这样更改了TextField样式: 现在,我希望它在用户点击时更改样式。 我的CustomTextFieldStyle定义为: 问题答案: 你有自己的TextStyle示例吗?请分享吧! 更新 您最好在样式中使用一些参数并将其绑定到“父”视图 结果看起来像

  • 问题内容: 可以为设置最大长度吗?我当时正在考虑使用事件来处理它,但仅在用户开始/完成编辑时才调用它,而在用户键入时不调用它。我也阅读了文档,但还没有找到任何东西。有什么解决方法吗? 问题答案: Paulw11的答案稍短一些: 您只需要一个TextField字符串的包装即可。可以将其视为一个解释器,该解释器每次发生更改时都会得到通知,并且能够将修改发送回TextField。但是,无需使用修饰符创建

  • 当满足某个条件时,我尝试重置一个值,但它不起作用,我遗漏了什么?

  • 问题内容: 我想更改TextField的占位符颜色,但是找不到它的方法。 我尝试设置和,但它不会更改占位符的颜色。 这是代码: 也许还没有API? 问题答案: 目前还没有api。 但您可以 : 自己使用和实现占位符: 现在,您可以像老板一样使用任何类型的编辑。 -自定义TextField 您总是可以创建自己的custom,以在所有地方使用: 用法 (带占位符):

  • 问题内容: 苹果的新框架似乎使用了一种 新型语法 ,可以有效地构建元组,但又具有另一种语法: 尝试解决这种语法的实际含义时 ,我发现这里使用的初始化程序将类型的闭包 作为第二个参数,其中的通用参数是通过闭包推断的。为了找出要推断的类型,我对代码进行了一些更改,并保持其功能: 以此,表明自己是类型,即类型。向上看,我发现它是一个源自自身的包装器类型,只能通过传递应该包装的元组来进行初始化。 题 现在