我为 SwiftUI创建了一个UIViewRepresentable
包装,因此我可以在用户点击回车键时更改第一响应者。UITextField
这是我的 UIViewRepresentable(为了简单起见,我删除了第一响应者代码)
struct CustomUIKitTextField: UIViewRepresentable {
@Binding var text: String
var placeholder: String
func makeUIView(context: UIViewRepresentableContext<CustomUIKitTextField>) -> UITextField {
let textField = UITextField(frame: .zero)
textField.delegate = context.coordinator
textField.placeholder = placeholder
return textField
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomUIKitTextField>) {
uiView.text = text
uiView.setContentHuggingPriority(.defaultHigh, for: .vertical)
uiView.setContentCompressionResistancePriority(.required, for: .vertical)
}
func makeCoordinator() -> CustomUIKitTextField.Coordinator {
Coordinator(parent: self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var parent: CustomUIKitTextField
init(parent: CustomUIKitTextField) {
self.parent = parent
}
func textFieldDidChangeSelection(_ textField: UITextField) {
parent.text = textField.text ?? ""
}
}
}
应用程序的第一个屏幕有一个“使用电子邮件登录”按钮,该按钮会推送显示 aCustomUIKitTextField
并使用ObservableObject
视图模型的 @Published 属性作为 TextField 文本的 MailView。
struct MailView: View {
@ObservedObject var viewModel: MailSignUpViewModel
var body: some View {
VStack {
CustomUIKitTextField(placeholder: self.viewModel.placeholder,
text: self.$viewModel.mailAddress)
.padding(.top, 30)
.padding(.bottom, 10)
NavigationLink(destination: UsernameView(viewModel: UsernameSignUpViewModel())) {
Text("Next")
}
Spacer()
}
}
}
一切正常,直到我推送另一个视图,如 MailView,例如 UsernameView。它以完全相同的方式实现,但是一旦我完成输入,它就会以某种方式CustomUIKitTextField
得到updateUIView
一个空字符串的调用。
还有一些奇怪的行为,例如当我将 MailView 和 UsernameView 包装在另一个 NavigationView 中时,一切正常。但这显然不是解决问题的方法,因为那时我会有多个 NavigationView。
它也适用于在视图模型中使用 @State 属性而不是 @Published 属性。但我不想使用@State,因为我真的想将模型代码保留在视图之外。
有没有人遇到相同或类似的问题?