SwiftUI 删除和移动功能 [英] SwiftUI delete and move functionality

查看:28
本文介绍了SwiftUI 删除和移动功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的移动和删除方法遇到了一些问题.这是这个问题的后续:SwiftUI Section from a struct 的属性

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.

delete 函数似乎正在删除我没有选择的行,并且移动方法因 尝试为单元格创建两个动画而崩溃.

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 - 现在有新的数据模型和工作删除

UPDATED ANSWER - now with new datamodel and working deletion

试试这个:

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

这篇关于SwiftUI 删除和移动功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆