首页 > 解决方案 > 我们如何通知 ObservableObject 其初始值设定项的更改?

问题描述

我有一个 ObservableObject-Class 在这个类中,我有一个名为persones的已发布变量!我确实使用一些名为allData的数据对其进行了初始化。

然后我尝试使用按钮操作更新我的allData,并且此操作将所需的更新应用于我的allData,但我发布的 var 不知道该数据已更新!

我们如何才能让发布看到新更新的allData

struct PersonData: Identifiable {
    let id = UUID()
    var name: String
}

var allData = [PersonData(name: "Bob"), PersonData(name: "Nik"), PersonData(name: "Tak"), PersonData(name: "Sed"), PersonData(name: "Ted")]

class PersonDataModel: ObservableObject {
    @Published var persones: [PersonData] = allData
}

struct ContentView: View {
    @StateObject var personDataModel = PersonDataModel()

    var body: some View {
        VStack
        {
            Button("update allData") { allData = [PersonData(name: "Bob")] }

            HStack
            {
                ForEach(personDataModel.persones) { person in Text(person.name) }
            }
        }
        .font(Font.title)
    }
}

PS:我不想为此使用 .onChange 或其他东西,我希望这发生在我的课堂内部。

我也知道我可以使用向下代码来完成这项工作,但这不是答案

personDataModel.persones = [PersonData(name: "Bob")] 

标签: swiftswiftui

解决方案


拥有顶级属性(在任何类或结构之外)可能不是一个好主意。我没有看到全貌,但看起来您的应用程序需要一个全局状态(例如,@StateObject在关卡上初始化App)。考虑这个答案:


如果你真的需要观察你的数组,你需要让它observable

一种选择是使用框架中的CurrentValueSubject Combine

var persons = ["Bob", "Nik", "Tak", "Sed", "Ted"].map(PersonData.init)
var allData = CurrentValueSubject<[PersonData], Never>(persons)

class PersonDataModel: ObservableObject {
    @Published var persones: [PersonData] = allData.value

    private var cancellables = Set<AnyCancellable>()

    init() {
        allData
            .sink { [weak self] in
                self?.persones = $0
            }
            .store(in: &cancellables)
    }
}

struct ContentView: View {
    @StateObject var personDataModel = PersonDataModel()

    var body: some View {
        VStack {
            Button("update allData") { 
                allData.send([PersonData(name: "Bob")]) 
            }
            HStack {
                ForEach(personDataModel.persones) { person in 
                    Text(person.name)
                }
            }
        }
        .font(Font.title)
    }
}

推荐阅读