繁体   English   中英

SwiftUI - FocusState 在视图中打开键盘 state 更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM