SwiftUI-表单中的ForEach即使内容正确存储也不会更新内容

问题描述

我到处都在寻找解决问题的方法,但是找不到。有this question 是相似的,但我想我在这里遇到了另一个问题。因此,我的代码(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,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,ObservableObject
                    @Observedobject var dm : DataManager //Which is conformed to Equatable,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创建),我可以看到它已正确更新。另外,我使用的每个Button都具有DataManager save()的功能(其中具有objectwillChange.send()),或者我将dm.objectwillChange.send()手动添加到Button的动作中。 尽管如此,ForEach中的内容不会更新。我只看到第一次打开应用程序时看到的东西,并且要查看更改,必须关闭应用程序并重新打开。

我在做什么错了?

感谢所有会回答的人!

解决方法

仅在使用14.2模拟器时,我看到的是同一件事。我仍在设法弄清楚,但似乎ForEach内部的视图无法根据数据更改正确地重新呈现。