Я создал 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()
}
}
}
Все работает нормально, пока я не выберу sh другой вид, такой как MailView, скажем, например, UsernameView. Он реализован точно так же, но каким-то образом CustomUIKitTextField
получает вызов updateUIView
с пустой строкой, когда я заканчиваю sh.
Существует дополнительное странное поведение, например, когда я оборачиваю MailView и UsernameView в другой NavigationView, все работает нормально. Но это явно не способ исправить это, так как тогда у меня будет несколько NavigationView.
Это также работает при использовании свойства @State вместо свойства @Published внутри модели представления. Но я не хочу использовать @State, поскольку я действительно хочу, чтобы код модели оставался вне поля зрения.
Есть ли кто-нибудь, кто сталкивался с такой же проблемой или схожей?