Jak se mohu pohybovat v Seznamu Položek, aniž byste museli přepínat EditMode

0

Otázka

Já jsem v současné době budování Seznam ToDo Aplikace v SwiftUI. Jeden rys, který bych opravdu chtěl realizovat, je schopnost řadit Seznam manuálně, tak jsem si integrovanou funkci pomocí .onMove modifikátor na můj ForEach smyčky vyplnění mého List, ale pořád jsem musel přepnout EditMode ručně, tak jsem nastavit EditMode seznamu být .active takto:

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

Ale nejsem spokojený s tímto Provádění, jak jsem stále muset použít grip z EditMode, a to také přestávky SwipeActions stejně jako Tlačítko funkce.

Tak jak se mohu pohybovat v Seznamu Položek bez použití EditMode?

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

Nejlepší odpověď

0

Na základě Asperi je odpověď na tuto otázku jsem implementoval drag and drop Gesta na opravit tento problém takto:

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

Pomocí DropDelegate provádění:

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

Poznámka: Položky, které nyní máte, aby odpovídaly Identifiable a Equatable takže minimální Realizace je:

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

a musíte také importovat:

import UniformTypeIdentifiers

aby bylo možné použít drag and drop funkce

2021-11-24 13:26:10

V jiných jazycích

Tato stránka je v jiných jazycích

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