SwiftData 回滚不更新 UI

问题描述 投票:0回答:1

我正在使用 SwiftData 构建一个简单的应用程序。在我的应用程序中,用户可以创建、删除和编辑帖子。编辑时,我希望他们能够点击“保存”来保存更改,或点击“取消”来放弃更改。我使用的方法是禁用自动保存并在保存时调用

modelContext.save()
并在放弃更改时调用
modelContext.rollback()
。所以我的
modelContainer
定义如下:

WindowGroup {
     ContentView()
         .modelContainer(for: [Post.self], isAutosaveEnabled: false)
}

我像这样保存并取消:

PostForm(post: post)
    .toolbar {
        ToolbarItemGroup(placement: .cancellationAction) {
            Button("Cancel") {
                if modelContext.hasChanges {
                    modelContext.rollback()
                }
                
                dismiss()
            }
        }
        
        ToolbarItemGroup(placement: .confirmationAction) {
            Button("Save") {
                do {
                    if modelContext.hasChanges {
                        try modelContext.save()
                    }
                } catch {
                    fatalError("Failed to save post: \(error.localizedDescription)")
                }
                
                callback?()
                dismiss()
            }
        }
    }

我面临的问题是,在调用

modelContext.rollback()
之后,我的帖子没有在用户界面中更新,它们仍然显示更改。重新启动应用程序会显示没有更改的帖子,所以我猜测
modelContext.rollback()
实际上是放弃更改,而不是将它们保留在存储中,UI 是不对更改做出反应的 UI。这种做法正确吗?我怎样才能使
modelContext.rollback()
中放弃的更改在 UI 中更新?

ios swift macos swiftui swiftdata
1个回答
0
投票

我在相关线程上找到了解决方案:如何使 SwiftData @Query 从后台上下文中所做的更改更新?

即使我没有使用后台上下文,此解决方案也有效:

extension MyModel: Identifiable {

    var id: String {
        "\(persistentModelID) \(property1) \(property2) ..."
    }

}

为了使其正常工作,请确保在上面的表示中使用受到影响的模型属性和关系。

© www.soinside.com 2019 - 2024. All rights reserved.