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

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

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

person Houmem    schedule 11.04.2020    source источник


Ответы (1)


ты имеешь в виду вот так?

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)
    }
}
person Chris    schedule 11.04.2020
comment
Спасибо @Chris, это сработало очень хорошо. Я просто хочу знать механику вашего кода, единственная разница между вашим и моим, я думаю, заключается только в том факте, что вы реорганизовали роль в отдельное представление, я действительно зацикливал действия ролей, сборку и запуск, но это не не показывать то, что должно показывать. Спасибо еще раз. - person Houmem; 15.04.2020