【发布时间】:2021-06-09 20:29:48
【问题描述】:
我在 Stack Overflow 上查看了一些关于使用 SwiftUI 进行拖放重新排序的问题,这个问题特别有用:SwiftUI | Using onDrag and onDrop to reorder Items within one single 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对象)
我不知道如何让.onDrag 中的NSItemProvider 使用字符串以外的任何内容,并且仍然可以使用我的SwiftUI 拖放功能。值得一提的是,我的 Task 和 Project 对象是 Core Data 类。
如何使NSItemProvider 包含键值对,以便我可以传递类型标识符字符串,如myapp.task(用于上述#1)和id(用于#2)?
【问题讨论】:
-
好资源:exploringswift.com/blog/…(解释使用
NSItemProviderReading,NSItemProviderWriting),swiftui-lab.com/drag-drop-with-swiftui(显示使用itemProviders(for:)在放置委托中,您需要检查您的自定义使用第一个链接中说明的方法注册的类型。 -
这是否回答了您的问题stackoverflow.com/a/60832686/12299030?
-
感谢您的快速回复。我之前查看了所有这些链接,但仍然对我的
Task对象如何表现得像一个似乎自动与UTType兼容的图像(TIFF 或UIImage)感到困惑。 Exploring Swift 这篇文章可能是我需要的,但它有点复杂,所以我需要一些时间来消化它。
标签: swift swiftui nsitemprovider