简体   繁体   English

为什么不更改 @ObservedObject 更新 UIViewRepresentable?

[英]Why don't changes to @ObservedObject update a UIViewRepresentable?

I have this simple example where I'm creating an @ObservedObject in a parent view and passing it to a child UIViewRepresentable .我有一个简单的例子,我在父视图中创建一个@ObservedObject并将其传递给子UIViewRepresentable When I click "Button", it modifies the @ObservableObject but the child view never gets updated (ie updateUIView is never called).当我单击“按钮”时,它会修改@ObservableObject但子视图永远不会更新(即永远不会调用updateUIView )。 Is there a different way to do this?有不同的方法可以做到这一点吗?

import SwiftUI

class UpdateViewState: ObservableObject {
  @Published var words = ["A", "B", "C"]

  func addWord(word: String) {
    print("added word")
    words.append(word)
  }
}

struct UpdateView: View {
  @ObservedObject private var state = UpdateViewState()

  var body: some View {
    VStack {
      UpdateViewRepresentable(state: state)
      Text("Button").onTapGesture {
        self.state.addWord(word: "A")
      }
    }
  }
}

struct UpdateViewRepresentable: UIViewRepresentable {
  @ObservedObject var state: UpdateViewState

  func makeUIView(context: Context) -> UILabel {
    let view = UILabel()
    view.text = "Hello World"
    return view
  }

  func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<UpdateViewRepresentable>) {
    print("updateUIView")
    uiView.text = state.words.joined(separator: ", ")
  }
}

try this:尝试这个:

public final class UpdateViewState: ObservableObject {

  @Published var words = ["A", "B", "C"]

  func addWord(word: String) {
    print("added word ", words)
    words.append(word)
  }
}

struct ContentView: View {

 @EnvironmentObject private var state: UpdateViewState

  var body: some View {
    VStack {
        UpdateViewRepresentable(state: .constant(state))
      Text("Button").onTapGesture {
        self.state.addWord(word: "A")
      }
    }.onAppear() {
        self.state.words.append("aha")
    }
  }
}

struct UpdateViewRepresentable: UIViewRepresentable {

    @Binding var state: UpdateViewState

  func makeUIView(context: Context) -> UILabel {
    let view = UILabel()
    view.text = "Hello World"
    return view
  }

  func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<UpdateViewRepresentable>) {
    print("updateUIView")
    uiView.text = state.words.joined(separator: ", ")
  }
}

This may help you in a very simple way:这可能会以一种非常简单的方式帮助您:

var body: some View {
        VStack {
          UpdateViewRepresentable(state: state)
          Text("Button").onTapGesture {
            self.state.addWord(word: "A")
            self.state.objectWillChange.send()
          }
        }
    }

Try to use the line I added, this will the View to update itself.尝试使用我添加的行,这将使视图自行更新。 Make sure you use:确保您使用:

import Combine

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么 @State 参数更改不会导致视图更新? - Why don't @State parameter changes cause a view update? @Binding 值更改时更新 UIView(在 UIViewRepresentable 内) - Update UIView (inside UIViewRepresentable) when @Binding value changes @ObservedObject 不发布对 View 的更改 - @ObservedObject not publishing changes to View SwiftUI - 尽管使用了@Published 和@ObservedObject,但视图不会更新 - SwiftUI - View doesn't update despite using @Published and @ObservedObject StateObject 属性不会更新视图,但 ObservedObject 会 - StateObject property doesn't update view but ObservedObject does SwiftUI 不会在嵌套 NavigationLink 目标中使用 ObservedObject 更新 UI - SwiftUI doesn't update UI with ObservedObject in nested NavigationLink destination 更新 UIViewRepresentable 中的绑定 - Update Binding in UIViewRepresentable 在 UIViewControllerRepresentable 中,如何将 ObservedObject 的值传递给视图 controller 并在每次值更改时更新它? - In a UIViewControllerRepresentable, how can I pass an ObservedObject's value to the view controller and update it every time the values changes? 为什么 SwiftUI @State 与 @ObservedObject 对于简单的 state 更改执行不同? - Why does SwiftUI @State performs differently than @ObservedObject for simple state changes? SwiftUI 自定义视图的 ViewBuilder 不会在子类 ObservedObject 更新上重新渲染/更新 - SwiftUI custom View's ViewBuilder doesn't re-render/update on subclassed ObservedObject update
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM