首页 > 解决方案 > 为什么不更改 @ObservedObject 更新 UIViewRepresentable?

问题描述

我有一个简单的例子,我@ObservedObject在父视图中创建一个并将它传递给一个子视图UIViewRepresentable。当我单击“按钮”时,它会修改@ObservableObject但子视图永远不会更新(即updateUIView永远不会被调用)。有不同的方法可以做到这一点吗?

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: ", ")
  }
}

标签: iosswiftswiftui

解决方案


这可能会以一种非常简单的方式帮助您:

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

尝试使用我添加的行,这将使视图自行更新。确保您使用:

import Combine

推荐阅读