Как создать представление с переменным количеством подпредставлений в SwiftUI? - PullRequest
1 голос
/ 06 августа 2020

У меня есть два массива с разным количеством элементов, и я хочу отображать каждый из этих элементов в разных подпредставлениях. Таким образом, пользователь должен перейти на вкладку «следующий», и следующий элемент массива будет отображаться до тех пор, пока он / она не окажется в конце массива.

Это должно работать следующим образом:

         ---FirstView(FirstElement)---SecondView(SecondElement)---ThirdView(ThirdElement)--Close
Mainview
         ---FirstView(FirstElement)---SecondView(SecondElement)--Close

Значит, мне нужно количество просмотров. Но я не знаю, как это сделать, и не могу найти что-то вроде этого.

Мой код следующий

struct ContentView: View {
    @State private var showPopover: Bool = false

    var body: some View {
        Button(action: {
                    self.showPopover.toggle()
                }) {
                    Text("Choose a Usergroup")
                }.sheet(isPresented: $showPopover) {
                    NewView(showPopover: $showPopover)
                }
    }
}

struct NewView: View {
    @Binding var showPopover: Bool
    @State var namesOfFemaleUsers = ["Sabrina", "Nicole", "Barbara"]
    @State var namesOfMaleUsers = ["Peter", "Bart", "Homer", "Bernie", "Carl"]
    var body: some View {
        NavigationView {
            HStack {
                NavigationLink(
                    destination: VariableView(showPopover: $showPopover, arrayData: namesOfMaleUsers),
                    label: {
                        Text("Male Users")
                    })
                NavigationLink(
                    destination: VariableView(showPopover: $showPopover, arrayData: namesOfFemaleUsers),
                    label: {
                        Text("Female Users")
                    })
            }

        }
    }
}

struct VariableView: View {
    @Binding var showPopover: Bool
    @State var arrayData: [String]
    var body: some View {
        VStack {
//         Here should be a Text with the name of first element and a button to go to the next View with the second element
            Button(action: {self.showPopover.toggle()}){
                Text("Close")
            }
        }
    }
}

1 Ответ

0 голосов
/ 06 августа 2020

Здесь возможен подход, просто оперируйте индексами доступных данных, проверяя диапазон на безопасность.

Протестировано с Xcode 12 / iOS 14.

struct NewView: View {
    @Binding var showPopover: Bool
    var namesOfFemaleUsers = ["Sabrina", "Nicole", "Barbara"]
    var namesOfMaleUsers = ["Peter", "Bart", "Homer", "Bernie", "Carl"]

    var body: some View {
        NavigationView {
            HStack {
                if !namesOfMaleUsers.isEmpty {
                    NavigationLink(
                        destination: VariableView(showPopover: $showPopover, arrayData: namesOfMaleUsers, index: 0),
                        label: {
                            Text("Male Users")
                        })
                }
                if !namesOfFemaleUsers.isEmpty {
                    NavigationLink(
                        destination: VariableView(showPopover: $showPopover, arrayData: namesOfFemaleUsers, index: 0),
                        label: {
                            Text("Female Users")
                        })
                }
            }

        }
    }
}

struct VariableView: View {
    @Binding var showPopover: Bool
    var arrayData: [String]
    var index: Int

    var body: some View {
        VStack {
            Text("User: \(arrayData[index])")
            if index + 1 < arrayData.count {
                NavigationLink(
                    destination: VariableView(showPopover: $showPopover, arrayData: arrayData, index: index + 1),
                    label: {
                        Text("Next")
                    })
            }
            Button(action: {self.showPopover.toggle()}){
                Text("Close")
            }
        }
    }
}
...