我正在尝试为我的LazyHGridview. 当我尝试将视图放到另一个视图上时,视图的右上角会显示绿色圆圈内的“加号”图标。
struct TestView: View {
var d: GridData
@Binding var list: [GridData]
@State private var dragOver = false
var body: some View {
VStack {
Text(String(d.id))
.font(.headline)
.foregroundColor(.white)
}
.frame(width: 160, height: 240)
.background(colorPalette[d.id])
.onDrag {
let item = NSItemProvider(object: String(d.id) as NSString)
item.suggestedName = String(d.id)
return item
}
.onDrop(of: [UTType.text], isTargeted: $dragOver) { providers in
return true
}
.border(Color(UIColor.label), width: dragOver ? 8 : 0)
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在 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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
...我还有一个Project列表,我可以将其拖动Task到该列表上以将其移动到该项目:
//ProjectView.swift
ScrollView{
VStack{
ForEach(model.projects, id: \.self){ project in
Text(project.name)
.onDrop(of: [UTType.text], delegate: ProjectDropDelegate(project: project))
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在努力解决的部分是我ProjectDropDelegate试图确定几件事:
id以便我可以对其采取行动?(或者,理想情况下,我可以使用整个Task对象)我不知道如何让我NSItemProvider使用.onDrag字符串以外的任何东西,并且仍然可以使用我的 SwiftUI 拖/放功能。对于它的价值,我Task和Project对象是核心数据类。 …