使用来自 ObservedObject 的数据的 SwiftUI FetchRequest 谓词会导致属性初始化程序在 self 可用之前运行

2023-12-07

我使用 CoreData 模型,其中组对象具有与实体成员连接的 GroupMembers(firstName: String)。 GroupMembers 有一个相应的属性组,该属性组连接回组对象。 在我的详细视图中,我传输一个组对象。在 FetchRequest 中,我想过滤与我转移的组具有相同组的所有 GroupMembers。

我使用以下代码:

struct GroupDetailView: View {
    @ObservedObject var group: Group
    
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \GroupMember.firstName_, ascending: true)],
        predicate: NSPredicate(format: "group == %@", group),
        animation: .default)
    private var members: FetchedResults<GroupMember>
    
    var body: some View {

    }
}

但我收到以下错误:

Cannot use instance member 'group' within property initializer; property initializers run before 'self' is available

这是一种方法:

struct GroupDetailView: View {

    private var fetchRequest: FetchRequest<GroupMember>
    private var members: FetchedResults<GroupMember> {
        fetchRequest.wrappedValue
    }
    
    init(group: Group) {
        fetchRequest = FetchRequest(sortDescriptors: [SortDescriptor(\.firstName)], predicate: group.membersPredicate)
    }

    var body: some View {

    }
}

您可能没有看到请求和结果像这样分解,这个想法的来源是头文件中的注释@SectionedFetchRequest.

您还需要将惰性变量添加到您的Group类扩展以挂在NSPredicate对象,以便在再次初始化此视图时可以重用它。在模型编辑器中,对于Group选择仅生成类扩展。然后在编辑器菜单中,选择创建 NSManagedObject 子类,选择 swift 文件所在的文件夹并选择应用程序的目标。它使这两个文件都删除类扩展名并保留类。您可能需要清理构建几次才能停止使用其自动生成的类文件。然后将其编辑为:

import Foundation
import CoreData

@objc(Group)
public class Group: NSManagedObject {

    lazy var membersPredicate = {
        NSPredicate(format: "group = %@", self)
    }()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用来自 ObservedObject 的数据的 SwiftUI FetchRequest 谓词会导致属性初始化程序在 self 可用之前运行 的相关文章

随机推荐