Ako môžem presunúť Položky Zoznamu bez nutnosti prepnúť EditMode

0

Otázka

Ja som v súčasnej dobe budovanie Zoznam Úloh Aplikáciu v SwiftUI. Jedna vlastnosť, že ja by som naozaj chcel realizovať, je schopnosť zoraďte Zoznam manuálne, tak som integrované funkcie pomocou .onMove modifikátor na mojom ForEach slučky osídľujúcich môj List,, ale stále som musel prepnúť EditMode manuálne, tak som nastaviť EditMode zo zoznamu .active a dopĺňa 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 nie som spokojný s týmto Implementácie, ako stále mám použiť priľnavosť z EditMode, a to aj prestávky SwipeActions rovnako ako Tlačidlo funkcie.

Tak ako môžem presunúť Zoznam Položiek bez použitia EditMode?

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

Najlepšiu odpoveď

0

Na základe Asperi odpoveď na túto otázku som implementované drag and drop Gestá opraviť tento problém nasledovne:

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

Pomocou DropDelegate realizácia:

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 teraz musia vyhovovať Identifiable & Equatable takže minimálne Realizácie je:

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

a tiež budete musieť importovať:

import UniformTypeIdentifiers

aby bolo možné použiť drag and drop funkcie

2021-11-24 13:26:10

V iných jazykoch

Táto stránka je v iných jazykoch

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