Ich habe versucht, Drag & Drop List
in SwiftUI zu implementieren. Was ich versuche zu tun, ist, eine Zeile auf eine zu ziehen List
und 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 Text
Werke 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