SwiftUI中TextEditor默认获焦失效,TextField正常问题求助
解决SwiftUI中TextEditor默认获取焦点的问题
你的代码对TextField有效但对TextEditor无效,核心原因是TextEditor在onAppear触发时可能还未完成视图布局与初始化,此时直接设置focusedField无法被正确响应。
修复方案
通过DispatchQueue.main.async将焦点设置操作推迟到下一个主循环执行,确保TextEditor已完成渲染:
struct ContentView: View { enum FocusedField { case firstName, lastName } @State private var firstName = "" @State private var lastName = "" @FocusState private var focusedField: FocusedField? var body: some View { TextEditor(text: $firstName) .focused($focusedField, equals: .firstName) .onAppear { // 推迟到下一个主循环执行焦点设置 DispatchQueue.main.async { focusedField = .firstName } } } }
替代方案:使用Task(iOS 15+)
也可以用Task来异步执行,效果和DispatchQueue一致:
.onAppear { Task { focusedField = .firstName } }
原理说明
TextField的初始化与布局流程比TextEditor更轻量,在onAppear时已经处于可响应焦点的状态;而TextEditor基于UITextView封装,初始化过程更复杂,需要等待视图完全挂载到视图层级后才能接收焦点事件。通过异步延迟,能确保操作在TextEditor准备就绪后执行。
内容的提问来源于stack exchange,提问作者Ahmed Zaidan
相关产品推荐
相关产品推荐

