微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关闭视图swiftui时键盘关闭无法正常工作

如何解决关闭视图swiftui时键盘关闭无法正常工作

当视图关闭键盘没有正确关闭时,我试图关闭键盘,它们只隐藏按钮但显示高度。更多细节请查看我的代码和屏幕截图。

  1. 键盘显示正常

Screenshot

  1. 打开和关闭键盘时转到下一个屏幕

Screenshot

  1. 键盘按钮隐藏但显示背景高度

Screenshot

import SwiftUI

struct ContentView: View {
    @State private var titleDtr: String = ""
    @State private var clearallText: Bool = false
    @State var updateKeyboard = true
    @State var userProfiles = [""]
    
    var body: some View {
        NavigationView{
            HStack{
                CustomTxtfldForFollowerScrn(isDeleteAcntScreen: .constant(false),text:  $titleDtr,clearallText: $clearallText,isFirstResponder: $updateKeyboard,completion: { (reponse) in
                    if titleDtr.count >= 3 {
                        userProfiles.append(titleDtr)
                    }else if titleDtr.count <= 3 {
                        userProfiles.removeAll()
                    }
                }).background(Color.red)
                
                vstack(spacing:0) {
                    List {
                        if userProfiles.count > 0 {
                            ForEach(userProfiles.indices,id: \.self) { indexs in
                                NavigationLink(destination: ShowLoadingText()) {
                                    Text(userProfiles[indexs]).foregroundColor(.blue)
                                }
                            }
                        }
                    }
                }
            }.ondisappear{
                updateKeyboard = false
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

import SwiftUI

struct ShowLoadingText: View {
    var body: some View {
        ZStack {
            vstack(alignment:.center,spacing: 15) {
                HStack(spacing:10){
                    Group {
                        ProgressView()
                            .progressViewStyle(CircularProgressViewStyle(tint: Color.white))
                        Text("Loading More Users...")
                    }
                }.foregroundColor(.black)
            }
        }
    }
}




struct CustomTxtfldForFollowerScrn: UIViewRepresentable {
    
    @Binding var isDeleteAcntScreen: Bool
    @Binding var text: String
    @Binding var clearallText: Bool
    @Binding var isFirstResponder: Bool
    var completion: (String) -> Void
    
    func makeUIView(context: UIViewRepresentableContext<CustomTxtfldForFollowerScrn>) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.text = text
        textField.delegate = context.coordinator
        textField.backgroundColor = .clear
        if isDeleteAcntScreen {
            textField.placeholder = "DELETE"
        }else{
            textField.placeholder = "Username"
        }
        textField.returnKeyType = .default
        textField.textColor = .black
        return textField
    }
    
    func makeCoordinator() -> CustomTxtfldForFollowerScrn.Coordinator {
        return Coordinator(self)
    }
    
    func updateUIView(_ uiView: UITextField,context: UIViewRepresentableContext<CustomTxtfldForFollowerScrn>) {
        uiView.text = text
        if isFirstResponder && !context.coordinator.didBecomeFirstResponder  {
            uiView.becomeFirstResponder()
            context.coordinator.didBecomeFirstResponder = true
        }else if clearallText {
            dispatchQueue.main.async {
                uiView.text! = ""
                text = ""
                clearallText = false
            }
        }else if !isFirstResponder {
            dispatchQueue.main.async {
                UIApplication.shared.endEditing()
            }
        }
    }
    
    class Coordinator: NSObject,UITextFieldDelegate {
        var didBecomeFirstResponder = false
        var parent: CustomTxtfldForFollowerScrn
        
        init(_ view: CustomTxtfldForFollowerScrn) {
            self.parent = view
        }
        
        func textFieldDidChangeSelection(_ textField: UITextField) {
            dispatchQueue.main.async {
                self.parent.text = textField.text ?? ""
                self.parent.completion(textField.text!)
            }
        }
        
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return true
        }
    }
}

import UIKit

extension UIApplication {
    func endEditing() {
        sendAction(#selector(UIResponder.resignFirstResponder),to: nil,from: nil,for: nil)
    }
}

解决方法

这是关闭键盘的另一种方法。

首先,移除主队列。

func updateUIView(_ uiView: UITextField,context: UIViewRepresentableContext<CustomTxtfldForFollowerScrn>) {
    uiView.text = text
    if isFirstResponder && !context.coordinator.didBecomeFirstResponder  {
        uiView.becomeFirstResponder()
        context.coordinator.didBecomeFirstResponder = true
    }else if clearAllText {
        DispatchQueue.main.async {
            uiView.text! = ""
            text = ""
            clearAllText = false
        }
    }else if !isFirstResponder { // < -- From here
        UIApplication.shared.endEditing()
    }
}

然后在 updateKeyboard 上更新 ShowLoadingText() 出现。

ForEach(userProfiles.indices,id: \.self) { indexs in
    NavigationLink(destination: ShowLoadingText().onAppear() { updateKeyboard = false }) { // <-- Here
        Text(userProfiles[indexs]).foregroundColor(.blue)
    }
}

删除 onDisappear 代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。