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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:22:11