¿Cómo puedo mover los Elementos de la Lista sin tener que alternar modo de edición

0

Pregunta

Actualmente estoy construyendo una Lista de Tareas de la Aplicación en SwiftUI. Una de las características que realmente me gustaría implementar es la capacidad para ordenar la Lista de forma manual, así que me he integrado la funcionalidad mediante una .onMove modificador en mi ForEach bucle de rellenar mi Listpero todavía tenía que alternar modo de edición de forma manual, así que me puse el modo de edición de la lista para ser .active de la siguiente manera:

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

Pero no estoy feliz con esta Aplicación, ya que todavía tengo que utilizar la empuñadura de modo de edición, y también se rompe SwipeActions así como la funcionalidad del Botón.

Entonces, ¿cómo puedo mover los Elementos de la Lista sin utilizar el modo de edición?

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

Mejor respuesta

0

Basado en Asperi la respuesta a esta pregunta he implementado arrastrar y soltar los Gestos para arreglar este problema de la siguiente manera:

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

El uso de un DropDelegate aplicació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
}
}

Nota: los Elementos que ahora se tienen que conformar con Identifiable & Equatable por lo que el mínimo de Aplicación es:

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

y también la necesidad de importación de:

import UniformTypeIdentifiers

para utilizar la funcionalidad de arrastrar y soltar

2021-11-24 13:26:10

En otros idiomas

Esta página está en otros idiomas

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