首页 > 解决方案 > SwiftUI 删除和移动功能

问题描述

我的移动和删除方法遇到了一些问题。这是对这个问题的跟进:SwiftUI Section from attribute of a struct

我正在尝试按公司对人员进行分组,上一个问题中提供的解决方案效果很好。它确实对我的移动和删除方法有影响,我发现很难弄清楚原因。

删除功能似乎正在删除我没有选择的行,并且 move 方法崩溃了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()
    }
}

标签: swiftswiftui

解决方案


更新的答案 - 现在有新的数据模型和工作删除

尝试这个:

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

推荐阅读