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

