我在 Stack Overflow 上查看了一些关于使用 SwiftUI 进行拖放重新排序的问题,这个问题特别有用:SwiftUI | 使用 onDrag 和 onDrop 在一个 LazyGrid 中重新排序项目?
我正在寻找扩展此功能,在我的 SwifUI 应用程序中,我将某些项目从一个项目列表拖到另一个项目列表中。假设我有一个Task
清单:
//TaskView.swift
ScrollView{
VStack{
ForEach(model.tasks, id: \.self){ task in
Text(task.name)
.onDrag{
NSItemProvider(object: String(task.id) as NSString)
}
}
}
}
...而且我还有一个Project
列表,我可以将其Task
拖到该列表上以将其移动到该项目:
//ProjectView.swift
ScrollView{
VStack{
ForEach(model.projects, id: \.self){ project in
Text(project.name)
.onDrop(of: [UTType.text], delegate: ProjectDropDelegate(project: project))
}
}
}
我正在努力的部分是在我ProjectDropDelegate
试图确定几件事的地方:
- 什么样的物体落在我身上?(必须是任务)
- 如果它是一项任务,它是什么,
id
所以我可以对其采取行动?(或者,理想情况下,我会让整个Task
对象都可以使用)
我不知道如何让我使用除字符串以外的任何东西NSItemProvider
,.onDrag
并且仍然可以使用我的 SwiftUI 拖放功能。对于它的价值,我Task
和Project
对象是核心数据类。
如何使NSItemProvider
包含键值对,以便我可以传递一个类型标识符字符串,如myapp.task
(对于上面的#1)和一个id
(对于#2)?