[英]SwiftUI - FocusState opens keyboard on view state change
我对 Textfields 有一个看法,我正在使用 FocusStates。
我的问题是,当我想显示错误消息时,键盘出现了。 重新加载视图时如何隐藏键盘?
struct SignInUI: View {
@State var email: String = ""
@State var password: String = ""
private enum Field: Int, CaseIterable {
case username, password
}
@FocusState private var focusedField: Field?
@StateObject var viewModel: SignInViewModel
var body: some View {
Group {
switch viewModel.state {
case .loading:
ZStack {
content
ProgressView()
}
case .error:
ZStack {
content
ErrorView()
}
case .loaded:
content
}
}
}
var content: some View {
VStack {
PasswordTextField(field: $password)
.focused($focusedField, equals: .password)
EmailTextField(field: $email)
.focused($focusedField, equals: .username)
ButtonView(text: "Sign In", action: {
focusedField = nil
viewModel.signIn(email: email, password: password)
})
}
}
}
当ErrorView
出现时,尝试将focusedField
设置为nil
:
case .error:
ZStack {
content
ErrorView()
.onAppear {
focusedField = nil
}
}
我发现这是禁用键盘的最通用方法。 您可以添加一个 state 来检测 isReloading state,然后调用这个 function 来禁用键盘。
import SwiftUI
struct HideKeyboard: View {
@State var username = ""
var body: some View {
TextField("User name (email address)", text: $username)
Button("Hide Keyboard") {
endEditing()
}
}
private func endEditing() {
// Call this function on any action you want to call from.
UIApplication.shared.endEditing()
}
}
extension UIApplication {
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.