如果对象属性更改,如何重新加载SwiftUI核心数据支持的列表行?

时间:2020-01-16 14:10:12

标签: core-data swiftui swiftui-list

我有一个标准的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返回一个视图,该视图根据myObject的各种属性显示不同的内容。

问题:当我在应用程序的其他位置修改特定的myObject(更改其属性之一)并保存关联的Core Data ManagedObjectContext时,表示该项目的List行不会在UI中更新/刷新。

可能的原因是我通过设置一个属性来更新我的Core Data对象,而该属性又设置了另一个属性。也许相关的信号没有到达正确的位置,我应该在这里发出更多通知。

MyObject中的代码。 ObjectType是一个枚举,typeValue是int32的后盾,实际上已存储在CD数据库中。

var type: ObjectType {
    get {
        return ObjectType(rawValue: typeValue)!
    }
    set {
        self.typeValue = newValue.rawValue
    }
}

修改支持的Core Data对象并将其保存在应用程序的其他位置时,如何使列表行更新?

1 个答案:

答案 0 :(得分:3)

我终于自己弄清楚了。该修补程序不在列表中,而是在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的任何更新都会导致重画。