Come posso spostare Elementi di una Lista, senza dover passare EditMode

0

Domanda

Attualmente sto costruendo una Lista ToDo App in SwiftUI. Una caratteristica che vorrei implementare è la possibilità di ordinare la vostra Lista manualmente, quindi ho integrato la funzionalità mediante un .onMove modificatore sul mio ForEach ciclo di popolare il mio Listma dovevo ancora passare EditMode manualmente, quindi ho impostato il EditMode della lista .active come segue:

import SwiftUI

struct ContentView: View {
@State private var items = ["1", "2", "3"]
@State var editMode: EditMode = .active

var body: some View {
    List {
        ForEach(items, id: \.self) { item in
            Text("Item \(item)")
        }
        .onMove(perform: { _, _  in })
    }
    .environment(\.editMode, $editMode)
}
}

Ma io non sono felice con questa Implementazione, in quanto devo ancora utilizzare l'impugnatura dal modo edit, e si rompe anche SwipeActions nonché la funzionalità del Pulsante.

Allora, come posso spostare Elenco Articoli senza utilizzare EditMode?

swiftui swiftui-list
2021-11-22 16:50:54
1

Migliore risposta

0

Basato su Asperi la risposta a questa domanda ho implementato trascinare e rilasciare i Gesti risolvere il problema come segue:

struct ContentView: View {

@State var items = [Item(id: 1), Item(id: 2), Item(id: 3), Item(id: 4)]
@State private var dragging: Item?

var body: some View{
    List{
        ForEach(items){ item in
            Text("Item \(item.id)")
                .onDrag {
                    self.dragging = item
                    return NSItemProvider(object: NSString())
                }
                .onDrop(of: [UTType.text], delegate: DragDelegate(current: $dragging))
        }
        .onMove(perform: {_, _  in })
    }
}
}

Utilizzando un DropDelegate attuazione:

struct DragDelegate<Item: Equatable>: DropDelegate {
@Binding var current: Item?

func dropUpdated(info: DropInfo) -> DropProposal? {
    DropProposal(operation: .move)
}

func performDrop(info: DropInfo) -> Bool {
    current = nil
    return true
}
}

Nota: le Voci ora sono conformi alle Identifiable & Equatable così il minimo Attuazione è:

struct Item: Identifiable, Equatable{
let id: Int
}

ed è anche necessario per l'importazione:

import UniformTypeIdentifiers

per utilizzare la funzionalità di trascinamento della selezione

2021-11-24 13:26:10

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................