如何与UiRepresentable结合使用?

时间:2019-09-30 09:59:33

标签: swiftui

我借助UiRepresentable在SwiftUi中创建了一个UiTextView。我想在调用textViewDidEndEditing时将通知发送回我的SwiftUi,因此我可以在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 :(得分:0)

您不需要使任何SwiftUI视图都符合ObservableObject。一个简单的绑定属性就可以了,因为它将所有相关数据传递回链中。

根据协议的声明,进一步的Swift struct类型不能符合ObservableObject

protocol ObservableObject : AnyObject

AnyObjectclass或引用类型。人们可能会使用ObservableObject之类的东西来监听视图模型或数据存储等。要从SwiftUI视图在视图链上传递数据,请改用@Binding

输入新值时,您只需分配给text绑定。

然后,您可以从调用视图的body实例化视图,传入可绑定的属性(例如,使用@State前缀的$或自定义{{1} }属性。

Binding

SwiftUI会为您处理其余的事情!

Documentation on ObservableObject