xcode - SwiftUI - 表单中的 ForEach 不会更新内容,即使它被正确存储
问题描述
我到处寻找解决问题的方法,但找不到任何解决方案。有一个类似的问题,但我认为我在这里遇到了不同的问题。因此,我的代码(Xcode 12.1,为 iOS 14.0 开发)如下所示:
import SwiftUI
struct ContentView: View {
@ObservedObject var cm : FolderModel //Which is conformed to Codable, Identifiable, Equatable, ObservableObject
@ObservedObject var dm : DataManager //Which is conformed to Equatable, Identifiable, ObservableObject
@State var pressedFolder = false
@State var valview : ValuesView
NavigationView {
VStack{
ScrollView(.horizontal) {
HStack { ForEach(dm.storageFolders) { foldersForEach in
Button(action: {
valview = ValuesView(cm: foldersForEach, dm: dm)
pressedFolder = true
}, label: {
Text(foldersForEach.folderName)})
}
if pressedFolder == false {
Form {
ForEach(dm.values) { passwordDelForEach in
NavigationLink(//This works correctly)
}
}
} else if pressedFolder == true {
valview //This is the thing that it's not updating when values are added to the folders
}
}
struct ValuesView : View {
@ObservedObject var cm : FolderModel //Which is conformed to Codable, Identifiable, Equatable, ObservableObject
@ObservedObject var dm : DataManager //Which is conformed to Equatable, Identifiable, ObservableObject
var body : some View {
Form {
ForEach (cm.folderValues) { folderValuesForEach in
NavigationLink(//This works correctly)
}
}
}
}
DataManager 中的数组都是这样声明的:
@Published var storage : [StorageModel] = [] {
didSet {
objectWillChange.send()
}
}
typealias Storage = [StorageModel]
如果我将任何内容添加到数组中(来自另一个视图),则数据将正确存储,因为通过打开 .plist 文件(DataManager 创建的)我可以看到它已正确更新。另外,我使用的每个按钮都具有 DataManager save() 的功能(其中包含 objectWillChange.send()),或者我手动将 dm.objectWillChange.send() 添加到按钮的操作中。尽管如此,ForEach 中的内容并没有更新。我只看到第一次打开应用程序时存在的东西,要查看更改,我必须关闭应用程序并重新打开它。
我究竟做错了什么?
感谢所有会回答的人!
解决方案
我看到了同样的事情,只是在使用 14.2 模拟器时。我仍在试图弄清楚,但似乎 ForEach 内部的视图没有在数据更改时正确重新呈现。