Я пытаюсь установить текстовое поле в качестве первого респондента, используя его свойство тега и @Binding. Поскольку я не могу получить доступ к базовому UITextField из SwiftUI TextField и напрямую вызвать .becomeFirstResponder()
, мне приходится оборачивать UITextField с помощью UIViewRepresentable
. Приведенный ниже код работает, но приводит к следующему сообщению консоли === AttributeGraph: cycle detected through attribute <#> ===
.
Звучит так, будто у меня утечка памяти и / или цикл сохранения, я выделил проблему в строку textField.becomeFirstResponder()
, но, проверив иерархию графов памяти Xcode, я не вижу, что не так?
Любая предоставляемая помощь приветствуется.
struct CustomTextField: UIViewRepresentable {
var tag: Int
@Binding var selectedTag: Int
@Binding var text: String
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var parent: ResponderTextField
init(_ textField: ResponderTextField) {
self.parent = textField
}
func textFieldDidChangeSelection(_ textField: UITextField) {
parent.text = textField.text ?? ""
}
}
func makeUIView(context: Context) -> UITextField {
let textField = UITextField(frame: .zero)
textField.tag = tag
textField.delegate = context.coordinator
return textField
}
func updateUIView(_ textField: UITextField, context: Context) {
if textField.tag == selectedTag, textField.window != nil, textField.isFirstResponder == false {
textField.becomeFirstResponder()
}
}
}