Добавление связанных данных с помощью формы с отношениями CoreData - PullRequest
0 голосов
/ 09 июля 2020

Мне нужна помощь с отношениями в моих CoreData. У меня две сущности; ProjectItem и TaskItem. У них есть отношения «один ко многим» (у одного проекта может быть много задач). У меня есть форма, в которой пользователь может добавить задачу, и я хочу, чтобы он мог выбрать проект из этого списка и назначить задачу проекту. Ниже приведены мои подклассы:

extension ProjectItem {

    @NSManaged public var projectTitle: String
    @NSManaged public var projectDateCreated: Date
    @NSManaged public var task: NSSet

}

// MARK: Generated accessors for task
extension ProjectItem {

    @objc(addTaskObject:)
    @NSManaged public func addToTask(_ value: TaskItem)

    @objc(removeTaskObject:)
    @NSManaged public func removeFromTask(_ value: TaskItem)

    @objc(addTask:)
    @NSManaged public func addToTask(_ values: NSSet)

    @objc(removeTask:)
    @NSManaged public func removeFromTask(_ values: NSSet)
    
    static func getProjectItemFetchRequest() -> NSFetchRequest<ProjectItem>{
        let request = ProjectItem.fetchRequest() as! NSFetchRequest<ProjectItem>
        request.sortDescriptors = [NSSortDescriptor(key: "projectDateCreated", ascending: false)]
        return request
    }

}
extension TaskItem {

    @NSManaged public var completedDate: Date
    @NSManaged public var createdDate: Date
    @NSManaged public var isComplete: Bool
    @NSManaged public var title: String
    @NSManaged public var project: ProjectItem

    static func getTaskItemFetchRequest() -> NSFetchRequest<TaskItem>{
        let request = TaskItem.fetchRequest() as! NSFetchRequest<TaskItem>
        request.sortDescriptors = [NSSortDescriptor(key: "createdDate", ascending: false)]
        return request
    }
    
}

Ниже приведено представление для добавления задач, и у меня уже настроен сборщик, который вытаскивает проекты. Я просто не знаю, как включить эту информацию при сохранении задачи.

struct TaskAdd: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext
    @Environment(\.presentationMode) var presentationMode
    @FetchRequest(fetchRequest: TaskItem.getTaskItemFetchRequest()) var taskItems: FetchedResults<TaskItem>
    @FetchRequest(fetchRequest: ProjectItem.getProjectItemFetchRequest()) var projectItems: FetchedResults<ProjectItem>
    
    @State private var title = ""
    @State private var project: ProjectItem?
    
    var body: some View {
        NavigationView {
            VStack(spacing: 0) {
                Form {
                    Section() {
                        TextField("Title", text: $title)
                    }
                    Section() {
                        Picker(selection: $project, label: Text("Add to Project")) {
                            Text("No Project").tag(nil as ProjectItem?)
                            ForEach(projectItems, id: \.self) { item in
                                Text("\(item.projectTitle)").tag(item as ProjectItem?)
                            }
                        }
                    }
                }.listStyle(GroupedListStyle())
                .navigationBarTitle(Text("Add Task"), displayMode: .inline)
                .navigationBarItems(leading:
                    Button("Cancel") {
                        self.presentationMode.wrappedValue.dismiss()
                    }, trailing:
                    Button("Add") {
                        let newTask = TaskItem(context:self.managedObjectContext)
                        newTask.title = self.title
                        newTask.isComplete = false
                        newTask.createdDate = Date()
                        do {
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)
                        }
                        self.presentationMode.wrappedValue.dismiss()
                    }
                )
            }
        }
    }
}

struct TaskAdd_Previews: PreviewProvider {
    static var previews: some View {
        TaskAdd()
    }
}

Я хотел бы иметь возможность назначать задачу проекту с помощью этой формы. Любая помощь здесь будет принята с благодарностью!

...