如何在swiftui中实现分组列表移动

如何在swiftui中实现分组列表移动,swiftui,grouped-list,Swiftui,Grouped List,如何在分组列表中实现onMove函数?不幸的是,我看不到我从哪里得到公司信息 代码如下: import SwiftUI struct Person: Identifiable, Hashable { var id = UUID() var name: String } struct Company : Identifiable, Hashable { var id = UUID() var name: String var employees :

如何在分组列表中实现onMove函数?不幸的是,我看不到我从哪里得到公司信息

代码如下:

import SwiftUI


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")]),
         Company(name: "Facebook", employees: [Person(name:"Mark"), Person(name:"Sandy")])
    ]

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

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

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

    func moveListItem(whichElement: IndexSet, to companyIndex: Int) {

        print(whichElement.first)
        if whichElement.count > 1 {
            whichElement.dropFirst()
            print(whichElement.first)
        }
        print(companyIndex)

//        let employee = companies[index].employees[whichElement.first!]
//        companies[index].employees.remove(at: whichElement.first!)
//
    }
}

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.companyList.deleteListItem(whichElement: indexSet, from: company)
                            }

                            .onMove { indexSet, intValue in
                                self.companyList.moveListItem(whichElement: indexSet, to: intValue)
                            }
                            .onInsert(of: ["chris"]) { (intValue, _) in
                                print("wtf")
                            }
                        }
                    }
                }
                .listStyle(GroupedListStyle())
                .navigationBarItems(trailing: EditButton())
            }
        }
    }
}

有两个主要变化和一个swiftUI缺点

更新了方法moveListItem

通过使用导航链接移动,创建了改变公司的替代方案

SwiftUI没有在GroupedList中使用.onMove在组之间移动的选项

该应用程序在技术上是有效的。但除非苹果增加了这一功能,否则就不是你想要的。还有一个选项,即使用自定义移动方法创建自定义列表视图,这是一个完全不同的主题

import SwiftUI

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")]),
        Company(name: "Facebook", employees: [Person(name:"Mark"), Person(name:"Sandy")])
    ]

    func deleteListItem(whichElement: IndexSet, from company: Company) {
        if let index = self.companies.firstIndex(of: company) {
            self.companies[index].employees.remove(atOffsets: whichElement)
        }
    }

    func moveListItem(whichElement: IndexSet, to companyIndex: Int, from company: Company) {
        if let index = self.companies.firstIndex(of: company) {
            self.companies[index].employees.move(fromOffsets: whichElement, toOffset: companyIndex)
        }
    }
}


struct  TestView: View {
    @EnvironmentObject 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
                                NavigationLink(destination: EditEmployee(company: company, employee: employee)){
                                    Text(employee.name)
                                }.id(UUID())
                            }
                            .onDelete { (indexSet) in
                                self.companyList.deleteListItem(whichElement: indexSet, from: company)
                            }
                            .onMove { indexSet, intValue in
                                self.companyList.moveListItem(whichElement: indexSet, to: intValue, from: company)
                            }
                            .onInsert(of: ["chris"]) { (intValue, _) in
                                print("wtf")
                            }
                        }
                    }
                }
                .listStyle(GroupedListStyle())
                .navigationBarItems(trailing: EditButton())
            }
        }
    }
}


struct EditEmployee: View {
    @EnvironmentObject var companyList: CompanyList
    var company: Company
    var employee: Person
    var body: some View {
        VStack(alignment: .leading) {
            Text("Company")
            Picker(selection: Binding<Company>(
                get: { () -> Company in
                    return self.company
            }, set: { (company) in
                if let cid = self.companyList.companies.firstIndex(of: self.company) {
                    if let eid =  self.companyList.companies[cid].employees.firstIndex(of: self.employee) {
                        if let ncid = self.companyList.companies.firstIndex(of: company) {
                            self.companyList.companies[cid].employees.remove(at: eid)
                            self.companyList.companies[ncid].employees.append(self.employee)
                        }
                    }
                }
            }
            ), label: Text("")){
                ForEach(self.companyList.companies) { company in
                    Text(company.name).tag(company)
                }
            }.pickerStyle(SegmentedPickerStyle())
            Spacer()
        }.padding()
            .navigationBarTitle(self.employee.name)
    }
}

onMove不支持在组之间移动项目。现在。