简体   繁体   中英

SwiftUI delete and move functionality

I'm running into some issues with my move and delete methods. This is a follow up to this question: SwiftUI Section from attribute of a struct

I'm trying to group people by company, and the solution provided in the previous question works great. It does have an effect on my move and delete methods and I'm finding it difficult to figure out why.

The delete function appears to be deleting rows that I didn't select, and the move method crashes with Attempt to create two animations for cell.

struct Person: Identifiable {
    var id = UUID()
    var name: String
    var company: String
}

class PeopleList: ObservableObject {

    @Published var people = [
        Person(name: "Bob", company: "Apple"),
        Person(name: "Bill", company: "Microsoft"),
        Person(name: "Brenda", company: "Apple"),
        Person(name: "Lucas", company: "Microsoft"),
    ]

    func getGroups() -> [String] {

        var groups : [String] = []

        for person in people {
            if !groups.contains(person.company) {
                groups.append(person.company)
            }
        }
        return groups
    }

    func deleteListItem(whichElement: IndexSet) {
        people.remove(atOffsets: whichElement)
    }

    func moveListItem(whichElement: IndexSet, destination: Int) {
        people.move(fromOffsets: whichElement, toOffset: destination)
    }
}

struct  ContentView: View {
    @ObservedObject var peopleList = PeopleList()

    var body: some View {
        NavigationView {
            List () {
                ForEach (peopleList.getGroups(), id: \.self) { group in
                    Section(header: Text(group)) {
                        ForEach(self.peopleList.people.filter { $0.company == group }) { person in

                            Text(person.name)
                        }
                        .onDelete(perform: self.peopleList.deleteListItem)
                        .onMove(perform: self.peopleList.moveListItem)
                    }
                }
            }
            .listStyle(GroupedListStyle())
            .navigationBarItems(trailing: EditButton())
        }
    }
}

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

UPDATED ANSWER - now with new datamodel and working deletion

try this:

struct Person: Identifiable, Hashable {
    var id = UUID()
    var name: String
}

struct Company : Identifiable, Hashable {

    var id = UUID()
    var name: String
    var employees : [Person]
}

class CompanyList: ObservableObject {

    @Published var companies = [
        Company(name: "Apple", employees: [Person(name:"Bob"), Person(name:"Brenda")]),
        Company(name: "Microsoft", employees: [Person(name:"Bill"), Person(name:"Lucas")])
    ]

    func deleteListItem(whichElement: IndexSet, from company: Company) {

        let index = companies.firstIndex(of: company)!

        companies[index].employees.remove(atOffsets: whichElement)
    }

//    func moveListItem(whichElement: IndexSet, destination: Int) {
//        companies.employees.move(fromOffsets: whichElement, toOffset: destination)
//    }
}

struct  ContentView: View {
    @ObservedObject var companyList = CompanyList()
    @State var text : String = ""

    var body: some View {
        NavigationView {
            VStack {
                List () {
                    ForEach (companyList.companies, id: \.self) { company in
                        Section(header: Text(company.name)) {
                            ForEach(company.employees) { employee in

                                Text(employee.name).id(UUID())
                            }
                            .onDelete { (indexSet) in
                                self.text = ("\(indexSet), \(indexSet.first)")
                                self.companyList.deleteListItem(whichElement: indexSet, from: company)
                            }

                            //    .onMove(perform: self.companyList.moveListItem)
                        }
                    }
                }
                .listStyle(GroupedListStyle())
                .navigationBarItems(trailing: EditButton())
                Text(text)
            }
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM