我创建了一个UIViewRepresentable
包裹UITextField
对于 SwiftUI,所以我可以例如当用户点击回车键时更改第一响应者。
这是我的 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 ?? ""
}
}
}
该应用程序的第一个屏幕有一个“使用电子邮件登录”按钮,该按钮会推送 MailView,其中显示CustomUIKitTextField
并使用 @Published 属性ObservableObject
将模型视为 TextField 的文本。
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),例如用户名查看。它的实现方式完全相同,但不知何故CustomUIKitTextField
得到一个updateUIView
当我完成输入后,用空字符串调用。
还有其他奇怪的行为,例如当我将 MailView 和 UsernameView 包装在另一个 NavigationView 中时,一切正常。但这显然不是解决它的方法,因为那时我会有多个导航视图。
当在视图模型中使用 @State 属性而不是 @Published 属性时,它也适用。但我不想使用@State,因为我真的想将模型代码保留在视图之外。
有没有人遇到过同样的问题或类似的问题?