如果对象属性发生变化,如何重新加载一行 SwiftUI 核心数据支持的列表?

Jaa*_*nus 3 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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加和删​​除项目时一切正常。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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jaa*_*nus 5

我终于自己弄明白了。修复不在列表中,而是在 RowView 中的堆栈下方。

RowView 代码是这样的:

struct RowView: View {
    var myObject: MyObject
    // Other code to render body etc
}
Run Code Online (Sandbox Code Playgroud)

执行此操作时,RowView 按预期工作,但将其myObject视为不可变的。对 myObject 的任何更改都不会导致视图重绘。

一个关键字的解决方法是将 @ObservedObject 添加到声明中:

struct RowView: View {
    @ObservedObject var myObject: MyObject
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢。你节省了我几个小时的时间。这很简单,但我忽略了它。以为是 SwiftUI bug (2认同)