如果对象属性发生变化,如何重新加载一行 SwiftUI 核心数据支持列表?
How to reload a row of SwiftUI Core Data-backed list if object properties change?
我有一个标准的 SwiftUI 列表设置,由 Core Data FetchRequest 提供支持。
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 returns 根据 myObject 的各种属性呈现不同内容的视图。
问题:当我在应用程序的其他地方修改特定的 myObject(更改其属性之一)并保存关联的核心数据 ManagedObjectContext 时,代表该项目的列表行不是 updated/refreshed UI.
可能的原因是我通过设置一个 属性 来更新我的核心数据对象,这又设置了另一个 属性。可能相关的信号没有到达正确的地方,我应该在这里发出更多的通知。
MyObject 中的代码。 ObjectType 是一个枚举,typeValue 是支持它的 int32,它实际上存储在 CD 数据库中。
var type: ObjectType {
get {
return ObjectType(rawValue: typeValue)!
}
set {
self.typeValue = newValue.rawValue
}
}
当支持核心数据对象被修改并保存在应用程序的其他地方时,如何使列表行更新?
我终于自己弄明白了。修复不在列表中,而是在堆栈的更下方,在 RowView 中。
RowView 代码是这样的:
struct RowView: View {
var myObject: MyObject
// Other code to render body etc
}
执行此操作时,RowView 按预期工作,但它将 myObject
视为不可变。对 myObject 的任何更改都不会导致视图重绘。
一个关键字修复是将@ObservedObject 添加到声明中:
struct RowView: View {
@ObservedObject var myObject: MyObject
}
它现在按预期工作,对 MyObject 的任何更新都会导致重绘。
我有一个标准的 SwiftUI 列表设置,由 Core Data FetchRequest 提供支持。
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 returns 根据 myObject 的各种属性呈现不同内容的视图。
问题:当我在应用程序的其他地方修改特定的 myObject(更改其属性之一)并保存关联的核心数据 ManagedObjectContext 时,代表该项目的列表行不是 updated/refreshed UI.
可能的原因是我通过设置一个 属性 来更新我的核心数据对象,这又设置了另一个 属性。可能相关的信号没有到达正确的地方,我应该在这里发出更多的通知。
MyObject 中的代码。 ObjectType 是一个枚举,typeValue 是支持它的 int32,它实际上存储在 CD 数据库中。
var type: ObjectType {
get {
return ObjectType(rawValue: typeValue)!
}
set {
self.typeValue = newValue.rawValue
}
}
当支持核心数据对象被修改并保存在应用程序的其他地方时,如何使列表行更新?
我终于自己弄明白了。修复不在列表中,而是在堆栈的更下方,在 RowView 中。
RowView 代码是这样的:
struct RowView: View {
var myObject: MyObject
// Other code to render body etc
}
执行此操作时,RowView 按预期工作,但它将 myObject
视为不可变。对 myObject 的任何更改都不会导致视图重绘。
一个关键字修复是将@ObservedObject 添加到声明中:
struct RowView: View {
@ObservedObject var myObject: MyObject
}
它现在按预期工作,对 MyObject 的任何更新都会导致重绘。