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
相关产品推荐
相关产品推荐

