簡體   English   中英

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

[英]Why don't changes to @ObservedObject update a 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: ", ")
  }
}

嘗試這個:

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

這可能會以一種非常簡單的方式幫助您:

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

嘗試使用我添加的行,這將使視圖自行更新。 確保您使用:

import Combine

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM