swiftui - 对 ObservedObject 的更改不会更新 UIViewRepresentable

标签 swiftui uiviewrepresentable

下面是最简单的例子。在预览中工作正常(UITextView 文本更新为“ouch”)。但是,在应用程序中运行它(即通过 sceneDelegate 添加为 rootView),UITextView 不会更新。

import SwiftUI

class ModelObject : ObservableObject{
    @Published var text = "Model Text"
}

struct MyTextView : UIViewRepresentable {
    @ObservedObject var modelObject : ModelObject

    func makeUIView(context: Context) -> UITextView {
        let result = UITextView()
        result.isEditable = true
        return result
    }
    func updateUIView(_ view: UITextView, context: Context) {
        view.text = modelObject.text
    }
}

struct BugDemoView : View{
    @ObservedObject var modelObject : ModelObject
    var body : some View{
        VStack{
            MyTextView(modelObject: modelObject)
            Button(action: {
                self.modelObject.text = "ouch"
            }){
                Text("Button")
            }
        }
    }
}

#if DEBUG

var mo = ModelObject()

struct BugDemoView_Preview: PreviewProvider {
    static var previews: some View {
        BugDemoView(modelObject: mo)
    }
    
}
#endif

最佳答案

这看起来像是 SwiftUI 的某种错误,但有两种解决方法:

  1. 将字符串作为 @Binding 传递给 MyTextView:
struct MyTextView : UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: Context) -> UITextView {
        let result = UITextView()
        result.isEditable = true
        return result
    }
    func updateUIView(_ view: UITextView, context: Context) {
        view.text = text
    }
}

struct BugDemoView : View{
    @ObservedObject var modelObject = ModelObject()
    var body : some View{
        VStack{
            MyTextView(text: $modelObject.text)
            Button(action: {
                self.modelObject.text = "ouch"
            }){
                Text("Button")
            }
        }
    }
}
  • 将字符串传递给MyTextView:
  • struct MyTextView : UIViewRepresentable {
        var text: String
    
        func makeUIView(context: Context) -> UITextView {
            let result = UITextView()
            result.isEditable = true
            return result
        }
        func updateUIView(_ view: UITextView, context: Context) {
            view.text = text
        }
    }
    
    struct BugDemoView: View{
        @ObservedObject var modelObject = ModelObject()
        var body: some View{
            VStack{
                MyTextView(text: modelObject.text)
                Button(action: {
                    self.modelObject.text = "ouch"
                }){
                    Text("Button")
                }
            }
        }
    }
    

    关于swiftui - 对 ObservedObject 的更改不会更新 UIViewRepresentable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354063/

    相关文章:

    ios - SwiftUI - 如何使水平 ScrollView RTL 友好?

    ios - 在 SwiftUI 中动态创建列表部分

    swift - 在 SwiftUI 中点击 MKMapView

    swiftui - 为什么绑定(bind)到 UIViewRepresentable 的注入(inject)会导致内存泄漏?

    swift - 在 UIViewRepresentable SwiftUI 中设置自定义 UIView 框架

    Color.clear 背景上的 SwiftUI onTapGesture 与 Color.blue 的行为不同

    ios - SwiftUI NavigationView 在滚动时折叠

    javascript - 在 swiftui 中评估 JavaScript

    swiftui - 与 SwiftUI 和 Combine 的双向绑定(bind)

    ios - SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获得线程 1 : EXC_BREAKPOINT crash