Cum pot muta Elemente de Listă fără a fi nevoie pentru a comuta comută în modul edit

0

Problema

Eu sunt în prezent clădirea este o Listă ToDo App în SwiftUI. O caracteristică care mi-ar plăcea să pună în aplicare este capacitatea de a sorta Lista manual, așa că m-am integrat funcționalitate folosind un .onMove modificator de pe ForEach bucla popularea mea List, dar am avut încă pentru a comuta comută în modul edit manual, asa ca am stabilit comută în modul edit din lista pentru a fi .active după cum urmează:

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

Dar eu nu sunt fericit cu această punere în Aplicare, așa cum am încă mai trebuie să folosiți mânerul din comută în modul edit, și, de asemenea, pauze SwipeActions precum și Butonul de funcționalitate.

Deci, cum pot muta Elemente de Listă, fără a utiliza comută în modul edit?

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

Cel mai bun răspuns

0

Bazat pe Asperi răspunsul la această întrebare am implementat drag and drop Gesturi pentru a rezolva această problemă, după cum urmează:

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

Folosind un DropDelegate aplicare:

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

Notă: Elementele de acum trebuie să se conformeze Identifiable & Equatable deci, punerea în Aplicare minim este:

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

și tu, de asemenea, nevoie pentru a importa:

import UniformTypeIdentifiers

în scopul de a folosi drag and drop funcționalitate

2021-11-24 13:26:10

În alte limbi

Această pagină este în alte limbi

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