永远不会调用 TextField onCommit
TextField onCommit is never called
我已经使用 SwiftUI 一周了,和大家一样,我正在努力确定某些不起作用的东西是错误还是我的误解。
我正在使用 TextField 视图,但从未执行 onCommit 闭包。 onEditingChanged 工作正常。当文本字段获得焦点时调用它为 true,当它失去焦点时调用它为 false。
然而,onCommit 闭包永远不会执行。根据代码中提供的少量文档:
onCommit: The action to perform when the user performs an action
(usually the return key) while the TextField
has focus.
这是代码:
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,但这不是本文的重点 post。我真的希望让它在纯 SwiftUI 代码中工作。
如果我能让 onCommit 工作,我应该放什么来实现我的目标?
更新:似乎问题只存在于 iOS,而不是 macOS,它似乎工作正常。
更新 2:这是我机器上 运行 建议代码的结果视频。我确实向 Apple 提交了一个错误...我们拭目以待。
在真实模拟器中试试。
记住一些注意事项:
- 遗憾的是,调试器无法使用实时预览
- 控制台未连接到实时预览,因此
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
您的代码 应该 可以正常工作,就像在 Xcode 11.0 beta 1 上一样。但是,我可以确认这目前在 beta 2 上没有按预期工作。我就此问题向 Apple 提交了错误报告。
更新:此问题已通过 Xcode 11 beta 3 修复。
我已经使用 SwiftUI 一周了,和大家一样,我正在努力确定某些不起作用的东西是错误还是我的误解。
我正在使用 TextField 视图,但从未执行 onCommit 闭包。 onEditingChanged 工作正常。当文本字段获得焦点时调用它为 true,当它失去焦点时调用它为 false。
然而,onCommit 闭包永远不会执行。根据代码中提供的少量文档:
onCommit: The action to perform when the user performs an action (usually the return key) while the
TextField
has focus.
这是代码:
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,但这不是本文的重点 post。我真的希望让它在纯 SwiftUI 代码中工作。
如果我能让 onCommit 工作,我应该放什么来实现我的目标?
更新:似乎问题只存在于 iOS,而不是 macOS,它似乎工作正常。
更新 2:这是我机器上 运行 建议代码的结果视频。我确实向 Apple 提交了一个错误...我们拭目以待。
在真实模拟器中试试。
记住一些注意事项:
- 遗憾的是,调试器无法使用实时预览
- 控制台未连接到实时预览,因此
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
您的代码 应该 可以正常工作,就像在 Xcode 11.0 beta 1 上一样。但是,我可以确认这目前在 beta 2 上没有按预期工作。我就此问题向 Apple 提交了错误报告。
更新:此问题已通过 Xcode 11 beta 3 修复。