Core data 如果对象属性更改,如何重新加载一行SwiftUI核心数据备份列表?
我有一个标准的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
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
}