【问题标题】:TextField onCommit is never called永远不会调用 TextField onCommit
【发布时间】:2019-06-18 10:16:22
【问题描述】:

我已经使用 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 提交了一个错误......我们会看到的。

【问题讨论】:

    标签: swift swiftui xcode11 ios13


    【解决方案1】:

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


    更新Xcode 11 beta 3 已修复此问题。

    【讨论】:

    • 我还提交了错误报告。如果您想链接它,请提及 FB6168390。
    • 谢谢!是的,我可以确认现在调用了 onCommit。
    【解决方案2】:

    在真实的模拟器中试试。

    记住一些注意事项:

    • 很遗憾,调试器无法使用实时预览
    • 控制台未连接到实时预览,因此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

    【讨论】:

    • 非常感谢您的示例!有一些非常奇怪的东西。我仍然无法使其工作...我创建了一个空项目并粘贴了您提供的 ContentView。仍然没有运气。 onCommit 永远不会被调用。现在我知道它适用于某人,我很肯定这不是编码问题......我会看看其他地方(还不知道在哪里;-)。顺便说一句,我总是在模拟器上测试。无法信任实时预览。那里有太多东西坏了,我不断测试所有东西以排除预览问题......所以我最终决定放弃它,直到它变得更稳定。
    • Xcode 使用您提供的 ContentView 创建的默认项目对我不起作用。输入内容并按 RETURN 后,COMMITTED 不会像屏幕截图中那样记录到屏幕上。
    • 你正在使用的 Xcode 的 Witch 版本?它基于 Xcode 11 beta-1 构建。当您选择textField 时,您看到edit = true。键盘出现了吗?
    • Xcode 11.0 beta 2 (11M337n)。昨天下载了。是的,编辑打印得很好。明天我将在另一台计算机上执行全新安装,看看问题是否仍然存在。
    • 嗯。为什么键盘顺便关闭?我将更新我的 macOS -> Xcode -> iOS,然后重新检查解决方法。但它绝对是一个经过验证的错误。
    猜你喜欢
    • 2021-04-15
    • 2014-11-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2012-10-27
    • 2013-10-12
    • 2017-12-31
    相关资源
    最近更新 更多