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 } } } } } } }
方案说明
- 移除原有的
onSubmit逻辑,避免提交操作导致的短暂失焦触发不必要的状态切换 - 通过
onChange(of: fieldIsFocused)监听聚焦状态,一旦检测到失焦,立刻在主队列中以无动画的方式重新设置聚焦状态 - 初始聚焦使用
DispatchQueue.main.async确保视图完全加载后再执行,避免早期设置失效的问题
这样就能实现TextField始终保持聚焦,键盘持续显示且无任何卡顿动画。
内容的提问来源于stack exchange,提问作者pwasoutside
相关产品推荐
相关产品推荐

