Ich habe versucht, Drag & Drop Listin SwiftUI zu implementieren. Was ich versuche zu tun, ist, eine Zeile auf eine zu ziehen Listund sie auf einer Zeile in der SAME abzulegen List, ähnlich wie die Reminders-App auf iOS.
Hinweis: Es ist wichtig zu beachten, dass ich nicht versuche, die Liste neu anzuordnen, sondern das gelöschte Element zu einem "untergeordneten" Element dieser Zeile zu machen.
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
}
}
Auf die TextWerke fallen lassen.

Das Ablegen auf der Listenzeile schlägt fehl.

Lösung des Problems
Es scheint, dass es zwei Probleme mit Ihrem Code gibt.
Erstens: Viele Artikel im Web berichten, dass das Drop auf der List-Komponente nicht funktioniert, aber Sie können die List durch eine ScrollView ersetzen. Dann wird die Drop-Methode aufgerufen.
Zweitens: Wenn Sie eine Drop-by-Item-Aktion anwenden möchten, müssen Sie Ihre Drop-Methode innerhalb von foreach verschieben.
Im aktualisierten Code habe ich gerade eine Beispielzelle hinzugefügt, Sie können einen Zelleffekt ganz einfach selbst reproduzieren:
struct Sample: View {
@State private var items: [Item] = [
Item(title: "Apple"),
Item(title: "Banana"),
Item(title: "Papaya"),
Item(title: "Mango")
]
var body: some View {
VStack {
ScrollView {
ForEach(items) { item in
SampleCell(item: item)
.onDrop(of: [UTType.text], delegate:dropDelegate() )
.onDrag{
NSItemProvider(item:.some(URL(string: "item")! as NSSecureCoding), typeIdentifier: String() )
}
}
}
Text("Drop Item Here..")
.fontWeight(.heavy)
.onDrop(of: [UTType.text], delegate:dropDelegate() )//works
}
}
}
struct SampleCell: View {
var item: Item
var body: some View {
HStack {
Text(item.title).padding()
Spacer()
}.frame(maxWidth:.infinity, minHeight: 60)
.background(Color.gray)
}
}
Keine Kommentare:
Kommentar veröffentlichen