SwiftUI Раздел из атрибута структуры - PullRequest
1 голос
/ 03 мая 2020

Допустим, у меня есть

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"),
  ]

//Various delete and move methods

}

Я бы хотел создать список с разделами, где каждый человек сгруппирован на основе своей компании. Я получил следующее, но это дает мне сгруппированные разделы для каждого человека, так что 4 раздела. Я хотел бы закончить с двумя разделами, один для Apple и один для Microsoft.

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

   var body: some View {
      NavigationView {
         List {
            ForEach(peopleList.people) { person in
               Section(header: Text(person.company)) {
                  Text(person.name)
               }
            }
         }
      .listStyle(GroupedListStyle())
      }
   }
}

Надеюсь, это имеет смысл! Спасибо!

1 Ответ

0 голосов
/ 03 мая 2020

попробуйте это:

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

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)
                        }
                    }
                }
            }.listStyle(GroupedListStyle())
        }
    }
}


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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...