【发布时间】:2021-12-24 03:31:20
【问题描述】:
我一直在尝试在 SwiftUI 中实现对 List 的拖放。我要做的是在List 上拖动一行并将其放在同一List 中的一行上,就像iOS 上的Remainders 应用程序一样。
注意:重要的是要注意,我不是要重新排列列表,而是要使删除的项目成为该行的“子项”。
import SwiftUI
import UniformTypeIdentifiers
struct Item: Identifiable {
let id = UUID()
let title: String
}
struct EditListView: View {
@State private var items: [Item] = [
Item(title: "Apple"),
Item(title: "Banana"),
Item(title: "Papaya"),
Item(title: "Mango")
]
var body: some View {
VStack {
List {
ForEach(items) { item in
Text(item.title)
}
.onDrop(of: [UTType.text], delegate:dropDelegate() )//doesn't work
.onDrag{
NSItemProvider(item: .some(URL(string: "item")! as NSSecureCoding), typeIdentifier: String() )
}
}
Text("Drop Item Here..")
.fontWeight(.heavy)
.onDrop(of: [UTType.text], delegate:dropDelegate() )//works
}
}
}
class dropDelegate: DropDelegate {
func performDrop(info: DropInfo) -> Bool {
print("drop success")
return true
}
}
放弃Text 作品。
删除列表行失败。
【问题讨论】:
-
在您的最终解决方案中是否需要重新排列并放入子列表?还是只需要删除到子列表?
-
我想同时移动到子列表并重新排列。
-
我不认为这是一个答案,但在昨晚玩这个的过程中,我确实发现你可以以你想要的方式在两个相邻的列表之间拖放,而无需任何特殊工作。所以我搞砸了两种可能的解决方案,它们基本上将两个列表分层并在它们之间分配拖放。一种解决方案与默认拖动交互不匹配,因为它没有在长按拖动时提升项目(您必须先移动拖动),另一种解决方案没有在悬停时以默认方式突出显示单元格降低。不确定是否对其中任何一个感兴趣?
-
两个分层列表的想法听起来很有趣。无论如何,即使它不是一个完整的答案,我也可以看看代码?
标签: swift swiftui drag-and-drop swiftui-list