10

我已经使用 SwiftUI 一周了,作为每个人,我都在努力确定不起作用的东西是错误还是我的误解。

我正在使用 TextField 视图,但从未执行onCommit闭包。onEditingChanged工作正常。当文本字段获得焦点时,它以 true 调用,当它失去焦点时,它以 false 调用。

然而, onCommit闭包永远不会执行。根据代码中可用的小文档:

onCommit:当用户在获得焦点时执行操作(通常是返回键)时执行的操作TextField

这是代码:

TextField($value,
          placeholder: Text(placeholder),
          onEditingChanged: { edit in
            print("edit = \(edit)")
          },
          onCommit: {
            print("COMITTED!")
          }).textFieldStyle(.roundedBorder).padding(.horizontal, 20)

理想情况下,我想将焦点从接收 RETURN 键的文本字段移开,并将焦点放在以下字段上。使用 UITextField 和 resignFirstResponder() 和 becomeFirstResponder() 很容易。

我已经设法使用UIViewRepresentable嵌入旧的 UITextField,但这不是这篇文章的重点。我真的希望让它在纯 SwiftUI 代码中工作。

如果我可以让 onCommit 工作,我应该放什么来实现我的目标?

更新:似乎问题只存在于 iOS,而不是 macOS,它似乎工作正常。

更新 2:这是在我的机器上运行建议代码的结果的视频。我确实向Apple提交了一个错误......我们拭目以待。

在此处输入图像描述

4

2 回答 2

4

您的代码应该可以正常工作,就像在 Xcode 11.0 beta 1 上一样。但是,我可以确认这目前在 beta 2 上没有按预期工作。我为此问题向 Apple 填写了错误报告。


更新: Xcode 11 beta 3修复了这个问题。

于 2019-06-19T04:01:08.863 回答
4

在真实的模拟器中试一试。

请记住一些注意事项:

  • 不幸的是,调试器无法使用实时预览
  • 控制台未连接到实时预览,因此print()结果不显示
  • 如果您想在预览模式下测试它,您可以稍微更改您的代码并构建一个简单的日志控制台以查看结果:

像这样:

struct ContentView : View {

    @State private var log: String = "Logs: "
    @State var value: String = ""

    var body: some View {
        VStack() {

            // Logger
            Text(log)
                .lineLimit(0)
            .padding()
            //
            Spacer()

        TextField($value,
                  placeholder: Text("placeholder"),
                  onEditingChanged: { edit in
                    self.log.append("\n edit = \(edit)")
        },
                  onCommit: {
                    self.log.append("\n COMITTED!")
        }).textFieldStyle(.roundedBorder).padding(.horizontal, 20)
            Spacer()
        }
    }
}
  • 实时预览有一个错误,导致它无法与键盘一起正常工作,并且它有一个史诗般的延迟(我的大约是 15 分钟)来显示屏幕键盘。所以如果你真的想在实时预览中看到结果,你应该非常耐心等待键盘:

在此处输入图像描述

  • 使用模拟器或真实设备来测试你想要的。视频:Xcode11-Beta1

在此处输入图像描述

于 2019-06-18T14:50:01.550 回答