iOS 16下SwiftUI TextField焦点变化时无法修改文本求助
iOS 16下SwiftUI TextField焦点时修改文本不生效的问题解决
问题原因
iOS 16对SwiftUI TextField的编辑状态处理逻辑做了调整:在onEditingChanged回调触发时,TextField正处于进入编辑状态的过程中,此时直接修改绑定的@AppStorage变量,会被TextField内部的编辑初始化状态覆盖,导致界面无法同步更新文本内容。
解决方案1:延迟状态更新
通过DispatchQueue.main.async将变量修改操作延迟到当前事件循环结束后执行,避开TextField内部状态的初始化覆盖:
struct ContentView: View { @AppStorage("TextMin") var textMin: String = "" var body: some View { TextField("Min", text: $textMin, onEditingChanged: { editingChanged in if editingChanged { print("TextField focused") // 延迟执行修改操作,避免被TextField内部状态覆盖 DispatchQueue.main.async { textMin = "50" } } else { print("TextField focus removed") } }) } }
解决方案2:使用focused修饰符监听焦点
改用focused修饰符配合onChange监听焦点状态,这种方式在iOS 16下更可靠,因为回调会在焦点状态稳定后触发:
struct ContentView: View { @AppStorage("TextMin") var textMin: String = "" @State private var isMinFieldFocused = false var body: some View { TextField("Min", text: $textMin) .focused($isMinFieldFocused) .onChange(of: isMinFieldFocused) { isFocused in if isFocused { print("TextField focused") textMin = "50" } else { print("TextField focus removed") } } } }
额外提示
Swift变量命名建议遵循小驼峰规范,将TextMin改为textMin更符合语言习惯。
内容的提问来源于stack exchange,提问作者Some guy
相关产品推荐
相关产品推荐

