简体   繁体   中英

how to implement move on a grouped list in swiftui

how do i implement the onMove function in a grouped list? unfortunately i cannot see where i get the "to company" information from...

here is the code:

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

There is 2 main changes and 1 swiftUI drawback.

  1. Updated the method moveListItem

  2. Created a alternative to change companies by moving with a NavigationalLink

  3. SwiftUI have no option to move between groups in GroupedList with .onMove()

The app works technically. But not as you intended unless Apple add the feature. There is one more option, that is to create custom list view with custom move method, which is entirely a different topic.

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

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