Cum să se ocupe de .onDelete pentru SwiftUI lista matrice cu .inversat()

0

Problema

Eu sunt încercarea de a face o bază SwiftUI listă în care fiecare nou element din listă este prezentată în partea de sus a listei. Pentru a face acest lucru, am adăugat .inversat() pentru a matrice a trecut în buclă ForEach, reprezentată de viewModel.itemList. Am, de asemenea, înființat .onDelete să se ocupe de eliminarea de elemente de listă. Cu toate acestea, atunci când am șterge un element, cum ar fi ultimul element din listă, în loc să-șterge ultimul element din matrice (elementul de la partea de sus a listei). Cum pot configura .onDelete pentru a șterge elementul corect atunci când matricea este inversat?

Codul meu de mai jos. Multumesc!!!

ContentView

struct ContentView: View {
    
    @StateObject var viewModel = ToDoListViewModel()
    @State private var listItemName = ""
        
    var body: some View {
        NavigationView {
            VStack(alignment: .leading) {
                List {
                    ForEach(viewModel.itemList.reversed()) { item in
                        Text(item.listItem)
                    }.onDelete { index in
                        self.viewModel.itemList.remove(atOffsets: index)
                    }
                }
                
                HStack {
                    TextField("Enter List Item", text: $listItemName)

                    Button(action: {
                        viewModel.addToList(ToDoModel(listItem: listItemName))
                        listItemName = ""
                    }) {
                        Image(systemName: "plus")
                            .font(.largeTitle)
                            .frame(width: 75, height: 75)
                            .foregroundColor(Color.white)
                            .background(Color.blue)
                            .clipShape(Circle())
                    }
                }.frame(minWidth: 100, idealWidth: 150, maxWidth: 500, minHeight: 30, idealHeight: 40, maxHeight: 50, alignment: .leading)
                    .padding(.leading, 16)
                    .padding(.trailing, 16)
            }.navigationBarTitle("To Do List", displayMode: .inline)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Model

struct ToDoModel: Identifiable, Codable {
    var id = UUID()
    var listItem: String = ""
}

ViewModel

class ToDoListViewModel: ObservableObject {
    @Published var itemList = [ToDoModel]()

    func addToList( _ item: ToDoModel) {
        itemList.append(item)
    }
}
arrays swift swiftui swiftui-list
2021-11-21 23:25:33
2

Cel mai bun răspuns

1

ai putea încerca, de asemenea, această abordare:

.onDelete { index in
    // get the item from the reversed list
    let theItem = viewModel.itemList.reversed()[index.first!]
    // get the index of the item from the viewModel, and remove it
    if let ndx = viewModel.itemList.firstIndex(of: theItem) {
        viewModel.itemList.remove(at: ndx)
    }
}
2021-11-22 00:15:13
1

Avertisment: acest lucru nu poate fi cel mai algoritmic metodă eficientă. Cu toate acestea, pentru simplu ștergerea de pe un List,, ar trebui să efectueze bine.

.onDelete { offsets in
    let reversed = Array(viewModel.itemList.reversed()) //get the reversed array -- use Array() so we don't get a ReversedCollection
    let items = Set(offsets.map { reversed[$0].id }) //get the IDs to delete
    viewModel.itemList.removeAll { items.contains($0.id) } //remove the items with IDs that match the Set
}
2021-11-22 00:11:34

În alte limbi

Această pagină este în alte limbi

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