Core Data 更改时更新 Swiftui 视图

Posted

技术标签:

【中文标题】Core Data 更改时更新 Swiftui 视图【英文标题】:Updating Switfui View when CoreData changes 【发布时间】:2021-11-08 16:34:14 【问题描述】:

我正在处理具有关系的 coredata 实体。问题是,然后我将一个项目附加到 UI 未更新的子数组。

var selectedNode : Node

var body: some View 
        VStack 
            ForEach(selectedNode.childrenArray)  item in
                NavigationLink 
                    Text("Item at \(item.text!)")
                 label: 
                    Text(item.text!)
                
            
            
        
        .toolbar 
            ToolbarItem 
                Button(action: addItem) 
                    Label("Add Item", systemImage: "plus")
                
            
        
        
    
    private func addItem() 
        withAnimation 
            viewContext.performAndWait 
                let newItem = Node(context: viewContext)
                newItem.text = "Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello world"
                newItem.dateAdded = Date()
                
                selectedNode.addToChildren(newItem)
                do 
                    try viewContext.save()
                 catch 
                    // Replace this implementation with code to handle the error appropriately.
                    // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                    let nsError = error as NSError
                    fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
                
            
            
        
   

正如预期的那样,当您使用 coredata 数组填充视图时,它会根据 coredata 中的任何更改自动更新视图。但是由于我们没有直接使用 coredata 数组来填充视图,我应该如何更新View

想到的一个可能的解决方案是使用谓词来获取属于“子数组”的项目,这样我们就可以直接使用 coredata 数组来填充视图。但我目前无法实现这一点。

【问题讨论】:

将 CoreData 对象包装在 @ObservedObject 中,并确保您使用的是 @FetchRequestNSFetchedResultsController。其他 fetch 请求,例如 NSFetchRequest 没有观察存储。 @ObservedObject var selectedNode : Node nodes[0],这是什么?在您的代码示例中,我没有看到任何nodes 的定义。 @JoakimDanielson 现在更正了代码。 @loremipsum 嗯,这很简单。 @ObservedObject var selectedNode : Node 已修复! 【参考方案1】:

所有 CoreData 对象都是ObservableObjects,因此需要将它们包装在@ObservedObject 中,以便在发生更改时刷新View

@ObservedObject var selectedNode : Node

另外,请确保您使用的是@FetchRequestNSFetchedRequestController,以便可以观察商店的变化。 NSFetchRequest没有观察店铺。

【讨论】:

以上是关于Core Data 更改时更新 Swiftui 视图的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中将加载的 json 文件中的更改保存到 Core Data

SwiftUI + Core Data - 更新对象(Detail -> DetailEdit)

从 Core Data 非标量属性更新 SwiftUI 视图

使用 ForEach SwiftUI Core Data 仅更改列表中的一项

使用“To Many”关系条目的“.allObjects”时,SwiftUI + Core Data 崩溃

在 SwiftUI 中将 @FetchRequest 与 Core Data 一起使用时修改 nil 排序行为