我使用 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(使用前将#替换为@)