You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:10:27