Comment puis-je déplacer les Éléments de la Liste sans avoir à basculer en mode édition

0

La question

Je suis actuellement en train de construire une Liste de choses à faire Application dans SwiftUI. Une fonctionnalité que j'aimerais vraiment mettre en œuvre est la possibilité de trier votre Liste manuellement, j'ai donc intégré la fonctionnalité en utilisant une .onMove modificateur sur mon ForEach boucle de remplissage de mon List, mais j'ai toujours eu pour basculer en mode édition manuellement, j'ai donc mis en EditMode de la liste .active comme suit:

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)
}
}

Mais je ne suis pas content de cette mise en Œuvre, comme je l'ai toujours utiliser la poignée de EditMode, et il rompt également SwipeActions ainsi que la fonctionnalité du Bouton.

Alors, comment puis-je déplacer les Éléments de la Liste sans l'aide de EditMode?

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

La meilleure réponse

0

Basé sur Asperi de répondre à cette question, j'ai mis en œuvre de glisser et déposer des Gestes pour résoudre ce problème comme suit:

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 })
    }
}
}

À l'aide d'un DropDelegate mise en œuvre:

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
}
}

Note: les Articles doivent maintenant se conformer à Identifiable & Equatable donc le minimum de mise en Œuvre est:

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

et vous avez aussi besoin d'importer:

import UniformTypeIdentifiers

pour utiliser la fonctionnalité de glisser-déposer

2021-11-24 13:26:10

Dans d'autres langues

Cette page est dans d'autres langues

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