를 처리하는 방법.onDelete 에 대한 SwiftUI 목록 배열을 가진.반전()

0

질문

내가 하려고 기본 SwiftUI 목록에서 각각의 새로운 목록 항목에서 최고의 목록입니다. 이렇게 하려면 내가 추가됩니다.반전()을 배열로 전달되 ForEach 반복으로 표시 viewModel.itemList. 나는 또한 설정합니다.onDelete 를 핸들을 제거하는 목록 항목입니다. 그러나 때,항목을 삭제한 마지막 항목으로 목록에서,그 대신 삭제 마지막 항목 배열에서(항목에서 최고의 목록). 나는 어떻게 구성할 수 있습니다.onDelete 을 삭제하는 올바른 항목 배열이 취소됩니까?

내 코드는 아래. 감사합니다!

콘텐츠

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

모델

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

뷰 모델

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

최고의 응답

1

할 수 있도 이 방법:

.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

주의:이 되지 않을 수 있습니다 가장 효율적인 알고리즘 방법입니다. 그러나,간단에서 삭제 List그를 수행해야 괜찮습니다.

.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

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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