В SwiftUI, как перебирать массив, который является атрибутом пользовательского объекта - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть простая объектная модель с двумя атрибутами, второй атрибут на самом деле является массивом строк. в простом виде я хочу показать первый атрибут, который называется roleName, а под ним перебрать второй атрибут, чтобы отобразить их в списке или с помощью forEach l oop. Я протестировал его с независимым массивом строк, он работает, но таким образом действия не отображаются. Спасибо за помощь. Код ниже:

import SwiftUI

struct ActionsView: View {

var role = Role(roleName: "Witch", roleActions: ["Action 1","Action 2"])

var body: some View {

        VStack(spacing: 20) {

           Text(role.roleName)
                    .font(.title).fontWeight(.heavy)

           VStack() {
                Text("Choose Your Actions")
                .font(.headline)

           List(role.roleActions, id: \.self) { action in
                HStack {
                    Text(action)
                }
            }


            }
        }

    }
}


struct ActionsView_Previews: PreviewProvider {
    static var previews: some View {
        ActionsView()
    }
}

1 Ответ

0 голосов
/ 11 апреля 2020

Вы имеете в виду, как это?

import SwiftUI

struct Role : Identifiable, Hashable {
    var id = UUID().uuidString

    var roleName: String
    var roleActions: [String]
}

struct RowView : View {

    var role : Role

    var body: some View {

        ScrollView(.horizontal, content: {
            HStack {
                ForEach(role.roleActions, id: \.self) { action in
                    Text(action)
                }
            }
        })
    }
}

struct ContentView: View {

    var roles = [Role(roleName: "Witch", roleActions: ["Action 1","Action 2"]),
                 Role(roleName: "Hero", roleActions: ["Action 3", "Action4"])]

    var body: some View {

        List (roles, id: \.self) { role in
            Text(role.roleName)
                .font(.title).fontWeight(.heavy)

            VStack() {
                Text("Choose Your Actions")
                    .font(.headline)

                RowView(role: role)

            }
        }.environment(\.defaultMinListRowHeight, 140)
    }
}
...