首页 > 解决方案 > 我们如何在 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
        
        
    }
    
}

标签: swiftui

解决方案


要使用onChange您的Data必须符合Equatable.

struct Data: Identifiable, Equatable { ... }

推荐阅读