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

@Environment(\.presentationMode) 导致包装 UIViewRepresentable 的文本字段被清除?

如何解决@Environment(\.presentationMode) 导致包装 UIViewRepresentable 的文本字段被清除?

由于 SwiftUI 文本字段的功能有限,我包装了文本字段 UIViewRepresentable。问题是当我从具有 @Environment(.presentationMode) 变量(我用来关闭给定视图)的视图导航到具有 UIViewRepresentable textfild 的给定视图时,一旦我更改选择,文本字段就会被清除.如何解决这个问题?

我用于文本字段的代码

struct CustomTextFieldUI: UIViewRepresentable {

    // 1
    @Binding var text: String
    @Binding var isFocused: Bool
    var placeHolderText = ""
    @Binding var didEndEditing:Bool
    
     // 2
    func makeUIView(context: UIViewRepresentableContext<CustomTextFieldUI>) -> UITextField {
        
        
        let tf = UITextField(frame: .zero)
        tf.isUserInteractionEnabled = true
        tf.delegate = context.coordinator
        tf.textColor = UIColor.white
        tf.setContentCompressionResistancePriority(.defaultLow,for: .horizontal)
        tf.font = UIFont(name: "Rubik-Medium",size: 14)
        tf.attributedplaceholder = NSAttributedString(string: placeHolderText,attributes: [
            .foregroundColor: UIColor(red: 0.20,green: 0.20,blue: 0.20,alpha: 1.00),.font: UIFont(name: "Rubik-Medium",size: 14)!
        ])
        return tf
    }

    func makeCoordinator() -> CustomTextFieldUI.Coordinator {
        return Coordinator(text: $text,isFocused: $isFocused,endEditing: $didEndEditing)
    }

    // 3
    func updateUIView(_ uiView: UITextField,context: Context) {
        uiView.text = text
       // uiView.isSecureTextEntry = !isRevealed
        
    }

    // 4
    class Coordinator: NSObject,UITextFieldDelegate {
        @Binding var text: String
        @Binding var isFocused: Bool
        @Binding var endEditing: Bool

        init(text: Binding<String>,isFocused: Binding<Bool>,endEditing: Binding<Bool>) {
            _text = text
            _isFocused = isFocused
            _endEditing = endEditing
        }

        func textFieldDidChangeSelection(_ textField: UITextField) {
            text = textField.text ?? ""
        }

        func textFieldDidBeginEditing(_ textField: UITextField) {
            dispatchQueue.main.async {
               self.isFocused = true
            }
        }

        func textFieldDidEndEditing(_ textField: UITextField) {
            dispatchQueue.main.async {
                self.isFocused = false
                self.endEditing = true
            }
        }

        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return false
        }
    }
}

可重复使用的文本字段

struct CustomFieldUI: View {
    
    var title: String
    var placeHolderText: String
    var image: String
    
    
    @Binding var fieldString: String
    @Binding var isInValid: Bool
        @State private var isFocused = false
    
    @State var didEndEditing = false
    
            vstack(){
                HStack {
//                    TextField(fieldText,text: $fieldString,onEditingChanged: { edit in
//                                self.isActive = edit})
                    CustomTextFieldUI(text: $fieldString,placeHolderText: placeHolderText,didEndEditing: $didEndEditing)
          
}

查看问题发生在

struct AddPostalAddress: View {
    
    @Observedobject var vm:AddNewPostalAddresviewmodel = AddNewPostalAddresviewmodel()
    @Environment(\.presentationMode) var presentationMode// use for the back button
    
    var body: some View {
      
                            CustomFieldUI(title: "Street Address Line 1",placeHolderText: "Type here",image: "ic_text field_check",fieldString: $vm.streetAddressLine1,isInValid: $vm.isInValidStreetAddressLine1,isErrorMessage: true,errorMsg: vm.streetAddressLine1ErrorMessage)
                                .padding(.top,16)

    }}

我从中导航的视图(如果我删除@Environment(.presentationMode) varpresentationMode,从这个视图中问题就消失了。

struct PostalAddressView: View {
    
    @Observedobject var vm = PostalAddressviewmodel()
    @Environment(\.presentationMode) var presentationMode
    @State private var showingDetail = false
    
    @State var defaultAddressID = 0
    //@Binding var hideView:Bool
    var body: some View {
                }
            }
            }
        .navigationBarTitle("test",displayMode: .inline)
        .navigationBarBackButtonHidden(true)
        .navigationBarItems(
            leading: Button(action: {
                //hideView = false
                self.presentationMode.wrappedValue.dismiss()
            },label: {
                Image("ic_calendar_back")
                    .renderingMode(.original)
            }),trailing:
                
                NavigationLink(
                                    destination: AddPostalAddress(),label: {
                                        Image("ic_nav_add")
                                        .renderingMode(.original)
                                    })
                .isDetailLink(false)
        )
}

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