ios - 为什么不更改 @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: ", ")
}
}
解决方案
这可能会以一种非常简单的方式帮助您:
var body: some View {
VStack {
UpdateViewRepresentable(state: state)
Text("Button").onTapGesture {
self.state.addWord(word: "A")
self.state.objectWillChange.send()
}
}
}
尝试使用我添加的行,这将使视图自行更新。确保您使用:
import Combine
推荐阅读
- c# - Dotnet 安装自定义模板问题
- gremlin - Gremlin 控制台 addV 似乎没有添加顶点
- websocket - Flutter 用 dart 实现 socket.io
- c - c语言%f变量,f在数字后面
- scala - 从地图到 csv scala 的优雅方式(展平地图)
- arrays - Powershell 批处理文件中的结构化数组增加了额外的空间
- node.js - 将值“{ _id: 5bd587cffb6fc074abb12cb8,\n name: \'name 2\',\n year: \'4\',\n id: \'102\' }”转换为字符串失败,路径为“winner”
- python - ValueError:形状(831,18)和(1629,2)未对齐:18(dim 1)!= 1629(dim 0)
- emacs - 将文件写入新目录后,ido模式打开错误目录
- docker - 在 Kitematic (Docker for Mac) 中更改了 SA 密码,我丢失了 localhost 中的所有数据库