Die List in Swift UI - Teil 3 - Benutzerdefinierte Listenelemente


Ein Element einer List muss nicht ein zwangsläufig mit nur einem Steuerelement angezeigt werden. Ohne Probleme sind dort komplexe Strukturen aus verschachtelten Stacks möglich. Oft ist es sogar von Vorteil, das Design des Listeneintrags in eine eigene View auszulagern. Das erhöht die Lesbarkeit und die Wiederverwendbarkeit. Das nächste Listing zeigt die View PersonListCell, die zusätzlich zum Vornamen und Nachnamen das Geburtsdatum anzeigt. Außerdem kommen verschiedene Schriftgrößen und Textfarben zum Einsatz.

struct PersonListCellView {

    

    var person : Person

    

    var body: some View {

        

        VStack {

            HStack {

                Text("\(person.firstName) \(person.lastName)")

                    .font(.title)

                Spacer()

            }

            HStack {

                Text("\(person.birthday.formatted(.dateTime.year().month().day()))")

                    .font(.body).foregroundColor(.secondary)

                Spacer()

            }

        }.padding(EdgeInsets(top: 1, leading: 5, bottom: 1, trailing: 0))

    }

}

Diese Struktur benötig zur Initialisierung eine Person, die von außen übergeben werden muss. In der List wird das ein Eintrag aus dem Repository sein. Jedoch benötigt auch die Vorschau innerhalb von Xcode eine Person, um die View anzeigen zu können. Glücklicherweise kann der statische RandomPersonGenerator jederzeit die benötige Person erzeugen.

struct PersonListCell_PreviewsPreviewProvider {

    static var previewssome View {

        PersonListCell(person:  RandomPersonGenerator.shared.generate())

    }

}

In der List muss anschließend nur das Text-Steuerelement durch die neu erstellte View PersonListCell ersetzt werden. Wie zuvor erwähnt, wird der View jedes Listeneintrags jeweils eine Person übergeben. Zusätzlich wurde im folgenden Code der List ein Stil hinzugefügt. Der PlainListStyle sorgt dafür, dass die Listenelemente die komplette Breite der View einnehmen. Es gibt dann keine Abstände mehr zum linken und rechten Rand.

import SwiftUI


struct ContentViewView {

    

    @ObservedObject var repo = PersonsRepository(randomPersonsCount10)

        

   var body: some View {


       List {

            ForEach(self.repo.persons, id: \.id) { person in

                PersonListCell(person: person)

            }

        }.listStyle(PlainListStyle())

    }

}

Stacks Image 162

Geschrieben am: 05.07.2021
Technologien: SwiftUI, List