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

SwiftUI中FocusState失效:点击按钮无法切换键盘状态

SwiftUI中FocusState点击按钮无法切换键盘状态的解决方法

问题原因

点击按钮时,系统会自动将焦点从TextField移除,导致@FocusState变量被系统设置为false,此时直接执行toggle()会被系统的焦点处理逻辑覆盖,无法实现预期的键盘切换效果。

修复方案一:延迟执行状态切换

通过DispatchQueue.main.async延迟执行状态切换,让系统先完成按钮点击的焦点转移逻辑,再执行我们的操作:

import SwiftUI

struct FocusStateBC_: View {
    
    @FocusState private var usernameFocus: Bool 
    @State private var username: String = ""

    var body: some View {
        VStack {
            TextField("Your name here...", text: $username)
                .focused($usernameFocus)
                .padding(.leading)
                .frame(height: 50)
                .frame(maxWidth: .infinity)
                .background(Color.gray.brightness(0.3))
                .cornerRadius(10)
            
            Button("TOGGLE FOCUS STATE"){
                DispatchQueue.main.async {
                    usernameFocus.toggle()
                }
            }
        }.padding(40)
    }
}

struct FocusStateBC__Previews: PreviewProvider {
    static var previews: some View {
        FocusStateBC_()
    }
}

修复方案二:手动管理焦点状态

直接判断当前焦点状态,分别执行聚焦/失焦操作,避免逻辑冲突:

Button("TOGGLE FOCUS STATE"){
    if usernameFocus {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    } else {
        usernameFocus = true
    }
}

注:原代码中变量名usernaminFocus存在拼写错误(缺少字母'e'),已修正为usernameFocus,不影响功能但符合命名规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:00:19