iOS14下SwiftUI的TextField在onCommit中无法清空问题
TextField清空失效问题解决(iOS14)
在iOS14的SwiftUI中,TextField的onCommit回调里直接执行text = ""无法清空输入框,核心原因是系统会在回调执行完毕后,重新将输入框的当前内容同步到绑定的State变量,导致你的清空操作被覆盖。而单独的Clear按钮不受这个逻辑影响,所以能正常清空。
解决方法
将清空操作放到DispatchQueue.main.async中,让系统先完成TextField的内容同步,再执行清空:
struct ContentView: View { @State private var text = "" @State private var words: [String] = [] var body: some View { Form { Section { TextField("Input", text: $text) { guard !text.isEmpty else { return } words.insert(text, at: 0) // 用异步延迟清空,避开系统的同步逻辑 DispatchQueue.main.async { text = "" } } } Section { Button("Clear") { text = "" } } Section { ForEach(words, id: \.self) { word in Text(word) } } } } }
补充说明
- 加入
guard !text.isEmpty else { return }是为了避免空内容被添加到列表中 - 如果你的项目后续升级到iOS15+,可以改用
onSubmit修饰符,它的执行时机不会有这个同步冲突问题:
TextField("Input", text: $text) .onSubmit { guard !text.isEmpty else { return } words.insert(text, at: 0) text = "" }
内容的提问来源于stack exchange,提问作者Tianhao Liu
相关产品推荐
相关产品推荐

