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

SwiftUI中如何让屏幕键盘始终保持显示状态

SwiftUI 实现TextField始终聚焦(键盘持续显示)的优化方案

我的SwiftUI应用中有如下组件:

struct ContentView: View {
    var search = Search()
   
    @FocusState private var fieldIsFocused: Bool
    
    @State private var word: String = ""
    var body: some View {
            VStack(alignment: .leading) {
                Text(word).font(.title2)
                Spacer()
                HStack{
                    Image(systemName: "magnifyingglass")
                    TextField(
                        "Search ...",
                        text: $word
                    )
                        .autocorrectionDisabled()
                        .autocapitalization(.none)
                        .textFieldStyle(.roundedBorder)
                        .onSubmit {
                            fieldIsFocused = true
                        }
                        .focused($fieldIsFocused)
                        .onAppear {
                            fieldIsFocused = true
                        }
                }
                .padding()
            }
}

我希望让TextField始终处于聚焦状态,保持键盘持续显示。之前尝试在组件出现和提交时设置fieldIsFocused = true,但会出现键盘先下滑再弹回的卡顿动画,需要更简洁的解决方案。


优化方案

通过监听聚焦状态的变化,在TextField即将失去焦点时无动画地强制重新聚焦,彻底避免键盘的卡顿动画:

struct ContentView: View {
    var search = Search()
   
    @FocusState private var fieldIsFocused: Bool
    
    @State private var word: String = ""
    var body: some View {
            VStack(alignment: .leading) {
                Text(word).font(.title2)
                Spacer()
                HStack{
                    Image(systemName: "magnifyingglass")
                    TextField(
                        "Search ...",
                        text: $word
                    )
                        .autocorrectionDisabled()
                        .autocapitalization(.none)
                        .textFieldStyle(.roundedBorder)
                        .focused($fieldIsFocused)
                        .onAppear {
                            // 初始聚焦,放在主队列确保视图已加载完成
                            DispatchQueue.main.async {
                                fieldIsFocused = true
                            }
                        }
                }
                .padding()
                // 监听聚焦状态变化,失去焦点时立刻无动画恢复
                .onChange(of: fieldIsFocused) { newValue in
                    if !newValue {
                        DispatchQueue.main.async {
                            withAnimation(.none) {
                                fieldIsFocused = true
                            }
                        }
                    }
                }
            }
    }
}

方案说明

  1. 移除原有的onSubmit逻辑,避免提交操作导致的短暂失焦触发不必要的状态切换
  2. 通过onChange(of: fieldIsFocused)监听聚焦状态,一旦检测到失焦,立刻在主队列中以无动画的方式重新设置聚焦状态
  3. 初始聚焦使用DispatchQueue.main.async确保视图完全加载后再执行,避免早期设置失效的问题

这样就能实现TextField始终保持聚焦,键盘持续显示且无任何卡顿动画。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:48:30