【问题标题】:SwiftUI - ForEach within a Form doesn't update content, even though it gets stored correctlySwiftUI - 表单中的 ForEach 不会更新内容,即使它被正确存储
【发布时间】:2025-12-05 14:15:01
【问题描述】:

我到处寻找解决问题的方法,但没有找到。有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, 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 中的内容并没有更新。我只看到第一次打开应用程序时存在的内容,要查看更改,我必须关闭应用程序并重新打开它。

我做错了什么?

感谢所有愿意回答的人!

【问题讨论】:

  • 试试这个:注释掉 NavigationView,然后再试一次
  • 我只是尝试退出 NavigationView,运行应用程序(但它没有工作),重新放置 NavigationView 并再次运行应用程序(它也没有工作与这个.. .)

标签: xcode foreach view swiftui auto-update


【解决方案1】:

我看到了同样的事情,只是在使用 14.2 模拟器时。我仍在尝试解决这个问题,但似乎 ForEach 内部的视图在数据更改时未正确重新呈现。

【讨论】:

  • 嗯好的,那么有没有办法“删除” ForEach 并“重新放置”它以便重新计算,或者使用不是 ForEach 但给我相同的东西结果..?
最近更新 更多