如何解决@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 举报,一经查实,本站将立刻删除。