Swiftui 如何与UiRepresentable结合使用?

Swiftui 如何与UiRepresentable结合使用?,swiftui,Swiftui,在UiRepresentable的帮助下,我在SwiftUi中创建了一个UiTextView。我想在调用TextViewDiEndediting时将通知发送回我的SwiftUi,这样我就可以在SwiftUi代码中这样使用它 SampleView { } .onRecieve(Customview.isTextViewDidEndEditing) { // Update Code } 有没有可能使我的customView类与ObserveObject保持一致,从而实现这一点 这是我的Custo

在UiRepresentable的帮助下,我在SwiftUi中创建了一个UiTextView。我想在调用TextViewDiEndediting时将通知发送回我的SwiftUi,这样我就可以在SwiftUi代码中这样使用它

SampleView
{
}
.onRecieve(Customview.isTextViewDidEndEditing)
{
// Update Code
} 
有没有可能使我的customView类与ObserveObject保持一致,从而实现这一点

这是我的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

    }



}
struct CustomView:UIViewRepresentable
{
@绑定变量文本:字符串
let willChange=PassthroughSubject()
var textViewDoneEditing:Bool?{didSet{willChange.send()}
func makeCoordinator()->Coordinator{
返回协调员(自我)
}
类协调器:NSObject、UITextViewDelegate、ObserveObject
{
var父对象:CustomView
init(uiTextView:CustomView){
self.parent=uiTextView
}
func textViewDidChange(textView:UITextView){
parent.text=textView.text
}
func textViewDidEndEditing(uTEXTVIEW:UITextView){
打印(“编辑完成”)
}  
}
func makeUIView(上下文:UIViewRepresentableContext)->UITextView{
让textView=UITextView()
textView.delegate=context.coordinator
返回文本视图
}
func updateUIView(uiView:UITextView,context:UIViewRepresentableContext){
uiView.text=self.text
}
}

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

此外,根据协议声明,Swift
struct
类型不能符合
observegeObject

protocol ObservableObject : AnyObject
AnyObject
类或引用类型。我们可以使用类似于
observateObject
的东西来监听视图模型或数据存储等。要从SwiftUI视图向上传递视图链中的数据,请改用
@Binding

当您的新值出现时,您可以简单地分配给
文本
绑定

然后,从调用视图的
主体
,您可以实例化视图,传入一个可绑定属性(例如使用
$
前缀的
@State
,或者自定义的
绑定
属性)

SwiftUI为您处理其余的事情


为什么不使用SwiftUI的原生文本字段?我会对答案感兴趣。对我来说,我最终没有使用
Combine
,只是简单地使用
Notification
——不太像SwiftUI,但我没有找到其他方法。它还消除了对可表示对象添加“层”的需要,而是直接从我的
observeObject
进入我的
UIKit
对象。@LuLuGaGa我需要多行编辑支持,这是TextField没有的。我知道已经过了几个星期了,所以我希望你能在一段时间前解决这个问题。(如果没有,也没关系!)
var body: some View {
    SampleView(text: $model.text)
}