swift - 我们如何通知 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")]
解决方案
拥有顶级属性(在任何类或结构之外)可能不是一个好主意。我没有看到全貌,但看起来您的应用程序需要一个全局状态(例如,@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)
}
}
推荐阅读
- azure-devops - 使用 Azure CLI 命令将本地 bash 脚本迁移到 Azure DevOps 中的 Azure Powershell 任务
- image - 如何在 Go 中发送带有图像和一些参数的 http post 请求?
- java - PagertabStrip 的堆叠位置
- php - 当我编写临时文件以将数据上传到 3rd 方网络存储时使用 `php://temp` 或 `tempnam`
- xamarin.forms - Xamarin 表单:检测到 Xamarin.Android.Support.Compat 的版本冲突
- excel - 在 Excel VBA 中保存 PowerPoint 文件时出现不可抑制的错误
- android - IOError: [Errno 2] 没有这样的文件或目录:目录...proj.android\\app/build/outputs/apk\\debug\\app-debug.apk
- javascript - Safari 将没有时区的 ISO 8601 日期时间字符串解析为 UTC 而不是本地
- javascript - 如何在不同的组件 React native 中设置状态?
- database - 测试数据库交互