Как использовать в сочетании с UiRepresentable? - PullRequest
2 голосов
/ 30 сентября 2019

Я создал UiTextView в SwiftUi с помощью UiRepresentable. Я хотел бы отправить уведомление обратно в мой SwiftUi, когда вызывается textViewDidEndEditing, так что я могу использовать его так в своем коде SwiftUi

SampleView
{
}
.onRecieve(Customview.isTextViewDidEndEditing)
{
// Update Code
} 

Возможно ли преобразовать мой класс CustomView в ObservableObject, чтобы это работало?

Вот мой пример кода для CustomTextView

struct CustomView : UIViewRepresentable

{
    @Binding var text : String


    let willChange = PassthroughSubject<Void, Never>()

    var textViewDoneEditing : Bool? {didSet {willChange.send()}}


    func makeCoordinator() -> Coordinator {

        return Coordinator(self)
    }


    class Coordinator : NSObject, UITextViewDelegate, ObservableObject

    {

    var parent: CustomView

           init(_ uiTextView: CustomView) {

               self.parent = uiTextView

           }

        func textViewDidChange(_ textView: UITextView) {

            parent.text = textView.text

        }


        func textViewDidEndEditing(_ textView: UITextView) {

            print("Ediiting is Done")


        }  

    }

   func makeUIView(context: UIViewRepresentableContext<CustomView>) -> UITextView {


        let textView = UITextView()
        textView.delegate = context.coordinator

        return textView
    }


    func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<CustomView>) {

        uiView.text = self.text

    }



}

1 Ответ

0 голосов
/ 19 октября 2019

Вам не нужно заставлять любой SwiftUI View соответствовать ObservableObject. Подойдет простое свойство привязки, так как оно будет передавать любые релевантные данные обратно по цепочке.

Кроме того, типы Swift struct не могут соответствовать ObservableObject согласно декларации протокола:

protocol ObservableObject : AnyObject

AnyObject - это class или ссылочный тип. Можно использовать что-то вроде ObservableObject для прослушивания модели представления, хранилища данных или тому подобного. Чтобы передать данные в цепочку представлений из представления SwiftUI, используйте вместо этого @Binding.

Вы просто назначите привязку text, когда придет новое значение.

Затем изbody вызывающего представления, вы можете создать его экземпляр, передав ему связываемое свойство (например, @State с использованием префикса $ или пользовательское свойство Binding).

var body: some View {
    SampleView(text: $model.text)
}

SwiftUIобрабатывает все остальное за вас!

Документация по ObservableObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...