SwiftUI: Как исправить «цикл AttributeGraph, обнаруженный с помощью атрибута» при вызове createFirstResponder для UIViewRepresentable UITextField - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь установить текстовое поле в качестве первого респондента, используя его свойство тега и @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()
        }
    }
}
...