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

SwiftUI中Sheet内TextField如何无延迟立即获取焦点?

SwiftUI Sheet中TextField立即获取焦点并消除延迟的解决方案

问题核心:直接在onAppear中设置焦点时,Sheet的过渡动画尚未完成,系统需等待动画结束后才响应焦点请求,导致键盘弹出延迟、UI移位不流畅。

解决方法一:使用延迟异步任务

通过DispatchQueue.main.asyncAfter延迟一小段时间设置焦点,让Sheet动画完成后再触发焦点请求:

struct SheetView: View {
    @Environment(\.dismiss) var dismiss

    @FocusState var isFocused
    @State var text: String = ""
    
    var body: some View {
        TextField("title", text: $text)
            .focused($isFocused)
            .onAppear {
                // 延迟0.1秒,等待Sheet过渡动画完成
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                    isFocused = true
                }
            }
        
        Button("Close") {
            dismiss()
        }
        .font(.title)
        .padding()
        .background(.black)
        .foregroundColor(.white)
    }
}

解决方法二:使用SwiftUI Task修饰符

用.task结合异步等待,更贴合SwiftUI的异步编程风格:

struct SheetView: View {
    @Environment(\.dismiss) var dismiss

    @FocusState var isFocused
    @State var text: String = ""
    
    var body: some View {
        TextField("title", text: $text)
            .focused($isFocused)
            .task {
                // 等待0.1秒(转换为纳秒单位)
                try? await Task.sleep(nanoseconds: 100_000_000)
                isFocused = true
            }
        
        Button("Close") {
            dismiss()
        }
        .font(.title)
        .padding()
        .background(.black)
        .foregroundColor(.white)
    }
}

原理说明:Sheet的present动画时长约0.3秒,延迟0.1秒足以让视图完成初始布局与动画关键帧,此时触发焦点请求会让键盘立即弹出,UI过渡更流畅。

内容的提问来源于stack exchange,提问作者Barrrdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:45:32