GOOGLE ADS

Donnerstag, 28. April 2022

Drag & Drop auf eine Listenzeile in Swiftui

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.

Geben Sie hier die Bildbeschreibung ein

Das Ablegen auf der Listenzeile schlägt fehl.

Geben Sie hier die Bildbeschreibung ein


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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...