swiftui - 我们如何在 onChange/onReceive 中使用 ObservableObject?
问题描述
我有这段代码,它有一个结构和 ObservableObject。我正在用一些按钮喂养我的 ObservableObject。我正在尝试在我的 ObservableObject 的任何更改中运行一些打印,它应该可以工作,但我不知道我错过了什么。
PS:我还想知道我应该使用 .onChange 还是 .onReceive 来完成这项工作?
struct Data: Identifiable
{
let id = UUID()
var name: String
}
let dataTrain1 = [Data(name: "A"), Data(name: "A"), Data(name: "A"), Data(name: "A"), Data(name: "A")]
let dataTrain2 = [Data(name: "A"), Data(name: "B"), Data(name: "B"), Data(name: "A"), Data(name: "A")]
class DataModel: ObservableObject
{
@Published var items: [Data] = []
}
struct ContentView: View
{
@StateObject var dataModel = DataModel()
var body: some View
{
ZStack
{
VStack
{
HStack
{
Button("Load dataTrain1") { dataModel.items = dataTrain1 }
Spacer()
Button("Load dataTrain2") { dataModel.items = dataTrain2 }
}
.padding(.horizontal)
Spacer()
}
HStack
{
ForEach(dataModel.items) { item in
Text(item.name)
.font(.title)
.bold()
.foregroundColor(item.name == "A" ? Color.red : Color.blue)
}
}
}
.onChange(of: dataModel.items) { _ in print("dataModel Changed!") } // ← Here
.onReceive(dataModel.$items) { _ in print("dataModel Changed!") } // ← Here
}
}
解决方案
要使用onChange
您的Data
必须符合Equatable
.
struct Data: Identifiable, Equatable { ... }
推荐阅读
- nhibernate - NHibernate 带有模式的表名前缀
- emoji - 表情符号问题:表情符号“举手:中浅肤色”显示为 2 个表情符号而不是 1 个
- c++ - Windows窗体中的C ++多行文本框溢出
- laravel - Laravel Backpack editEntity 视图中的自动填充字段
- java - java Nashorn 中的默认方法是在实际方法不存在时调用的吗?
- java - Android Gradle 5.0 更新:原因:org.jetbrains.plugins.gradle.tooling.util
- ios - IOS Universal Links 或 URL Scheme 在应用程序之间共享信息
- java - 如何为我想在 java 中调用的这个 MySQL 查询创建存储过程
- javascript - 如何在不“切换”电子应用程序的情况下将窗口放在前面?
- catia - 您如何测量最大尺寸?