是否可以在 SwiftUI 的 @FetchRequest 属性包装器内的谓词中使用核心数据记录?
我有一个项目列表和一个任务列表。我想点击一个项目并导航到该项目的相关任务列表。我似乎找不到在初始化 @FetcheRequest 之前以 SwiftUI 可以看到的方式传入父项目的方法。
我尝试将父项目放在 EnvironmentObject 中。当我从 ProjectListView 导航到 TaskListView 时调用它。
TaskListView()
.environment(\.managedObjectContext, self.managedObjectContext)
.environmentObject(self.projectToEdit)
然后在TaskListView中我添加了这个:
@Environment(\.managedObjectContext) var managedObjectContext
@EnvironmentObject var parentProject: Project
@FetchRequest(
entity: Task.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Task.name, ascending: true)
],
predicate: NSPredicate(format: String(format: "%@%@", "taskProject", " == %@"), parentProject)
) var tasks: FetchedResults<Task>
我在谓词行中收到以下错误。
Cannot use instance member 'parentProject' within property initializer; property initializers run before 'self' is available
那么有没有办法以某种方式编写可以使用父项目的谓词?将项目传递给任务 View 似乎不会起作用。我还能如何在这样的谓词中使用记录?
最佳答案
FetchRequest 可以在 init
中动态创建。方法。这样你就可以改变谓词和排序条件。这是一些示例代码来实现这一点。
// sample Project class
class Project:NSManagedObject {
var id : String
var name : String
}
// sample Task class
class Task:NSManagedObject {
var id : String
var prjId : String
var name : String
}
// Task List View
struct TaskListView: View {
@Environment(\.managedObjectContext) var managedObjectContext
private var tasksRequest: FetchRequest<Task>
private var tasks: FetchedResults<Task> { tasksRequest.wrappedValue }
private var project:Project
// init Task with Project
init(_ project:Project) {
self.project = project
// create FetchRequest
self.tasksRequest = FetchRequest(
entity: Task.entity(),
sortDescriptors: [NSSortDescriptor(key: "name", ascending:true)],
predicate: NSPredicate(format: "prjId == %@", project.id))
}
var body: some View {
VStack {
Section(header: Text("Tasks under \(project.name):")) {
// access the fetched objects
ForEach(tasks, id:\.id) { task in
Text("\(task.name)")
}
}
}
}
}
然后调用
TaskListView()
看起来像:// call to TaskListView
TaskListView(self.projectToEdit)
.environment(\.managedObjectContext, self.managedObjectContext)
关于core-data - SwiftUI 和 Core Data - 如何在谓词中使用父记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58643700/