Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data 如果对象属性更改,如何重新加载一行SwiftUI核心数据备份列表?_Core Data_Swiftui_Swiftui List - Fatal编程技术网

Core data 如果对象属性更改,如何重新加载一行SwiftUI核心数据备份列表?

Core data 如果对象属性更改,如何重新加载一行SwiftUI核心数据备份列表?,core-data,swiftui,swiftui-list,Core Data,Swiftui,Swiftui List,我有一个标准的SwiftUI列表设置,由核心数据获取请求提供支持 struct SomeView: View { var container: Container var myObjects: FetchRequest<MyObject> init(container: Container) { let predicate : NSPredicate = NSPredicate(format: "container = %@", conta

我有一个标准的SwiftUI列表设置,由核心数据获取请求提供支持

struct SomeView: View {

    var container: Container
    var myObjects: FetchRequest<MyObject>

    init(container: Container) {
        let predicate : NSPredicate = NSPredicate(format: "container = %@", container)
        self.container = container
        self.myObjects = FetchRequest<MyObject>(entity: MyObject.entity(), sortDescriptors: [NSSortDescriptor(key: "date", ascending: true)], predicate: predicate)
    }

    var body: some View {
        VStack(spacing: 0.0) {
            List(myObjects.wrappedValue, id: \.uniqueIdentifier) { myObject in
                rowView(for: myObject, from: self.myObjects.wrappedValue)
            }
        }
    }
}

当备份核心数据对象被修改并保存在应用程序中的其他位置时,如何使列表行更新?

我终于自己解决了这个问题。修复不在列表中,而是在堆栈的下一层,在RowView中

RowView代码是这样的:

struct RowView: View {
    var myObject: MyObject
    // Other code to render body etc
}
执行此操作时,行视图按预期工作,但它将
myObject
视为不可变。对myObject的任何更改都不会导致视图重画

一个关键字修复是将@ObservedObject添加到声明中:

struct RowView: View {
    @ObservedObject var myObject: MyObject
}

它现在按预期工作,对MyObject的任何更新都会导致重新绘制。

什么是“其他地方”?好吧,如果你在别处修改了一些东西,那就意味着呈现数据的视图不是活动的,当它再次变为活动时,它应该会拉取新数据,不是吗?基本上你是正确的。在这种情况下,通过上下文菜单按钮进行修改。我在项目上有一个上下文菜单按钮,在这里我修改项目并保存托管对象上下文。是的,如果我做了修改,然后导航离开并返回,该项目将正确更新。我考虑了更多,并且。。。您不使用
@FetchRequest
@Environment
属性包装器有什么特殊原因吗?我认为这些可以确保立即重新加载。如果没有它们,则仅在重新计算视图时重新加载。如果你不熟悉它们的用法,我可以发布一个例子。是的,我这样做是有原因的。注意,“container”上有一个谓词,它作为参数传递给这个视图。据我所知,没有一种方法可以用属性包装器来做这种谓词。不过有一点很有趣。在我的应用程序的其他地方,我确实有一个PropertyRapper驱动的FetchRequest,它实际上按照预期在适当的位置重新加载信息。这可能是根本原因,我需要对此进行测试。嗨,Jaanus,我正在努力解决类似的问题,我有一个带有列表的根视图,然后是一个像您这样接收对象的行视图,我在其中添加了
@ObservedObject
,但更新仍然没有反映出来。RowView将用户带到detailview,从那里用户将被带到另一个视图,在该视图中对模型进行更改。完成后,用户将返回详图视图,但不会反映任何更改。如果我回到列表,然后再回到细节,变化就在那里。听起来熟悉吗?有什么线索吗?谢谢非常感谢。你帮我节省了几个小时的时间。这很简单,但我忽略了它。我还以为是雨燕虫嗨,@Jaanus,你能看看我类似的问题吗。
struct RowView: View {
    @ObservedObject var myObject: MyObject
}