Düzenleme modunu değiştirmek zorunda kalmadan Liste Öğelerini nasıl taşıyabilirim

0

Soru

Şu anda Swiftui'de bir yapılacaklar Listesi Uygulaması oluşturuyorum. Gerçekten uygulamak istediğim bir özellik, Listenizi manuel olarak sıralama yeteneğidir, bu yüzden işlevselliği bir .onMove değiştirici benim ForEach döngü doldurma benim List Ancak yine de Editmode'u manuel olarak değiştirmek zorunda kaldım, bu yüzden listenin editmode'unu şöyle ayarladım: .active aşağıdaki gibi:

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

Ancak bu Uygulamadan memnun değilim, çünkü hala Editmode'dan kavramayı kullanmam gerekiyor ve aynı zamanda Düğme işlevselliğinin yanı sıra tokatlama işlemlerini de kırıyor.

Peki Liste Öğelerini EditMode kullanmadan nasıl taşıyabilirim?

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

En iyi cevabı

0

Asperi'nin bu soruya verdiği cevaba dayanarak, bu sorunu aşağıdaki gibi düzeltmek için sürükle ve bırak Hareketlerini uyguladım:

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

Bir kullanarak DropDelegate uygulama:

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: Öğeler şimdi aşağıdakilere uymalıdır Identifiable & Equatable yani minimum Uygulama şu şekildedir:

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

ve ayrıca içe aktarmanız gerekiyor:

import UniformTypeIdentifiers

sürükle ve bırak işlevini kullanmak için

2021-11-24 13:26:10

Diğer dillerde

Bu sayfa diğer dillerde

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