[英]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.