I would like to do something like this.
Code Block | struct FirstView: View{ |
| @State var selectedValue = 0 |
| var selectedView : some View = SubviewA() |
| var body: some View{ |
| VStack{ |
| Picker(selection: $selectedValue, label: Text("someText")){ |
| Text("A").tag(0) |
| Text("B").tag(1) |
| Text("C").tag(2) |
| Text("D").tag(3) |
| Text("E").tag(4) |
| Text("F").tag(5) |
| }.pickerStyle(SegmentedPickerStyle()) |
| selectedView |
| } |
| } |
| } |
|
| struct SubviewA: View{ |
| var body: some View{ |
| Text("Subview A") |
| } |
| } |
|
| struct SubviewB: View{ |
| var body: some View{ |
| Text("Subview B") |
| } |
| } |
|
| struct SubviewC: View{ |
| var body: some View{ |
| Text("Subview C") |
| } |
| } |
|
| struct SubviewD: View{ |
| var body: some View{ |
| Text("Subview D") |
| } |
| } |
|
| struct SubviewE: View{ |
| var body: some View{ |
| Text("Subview E") |
| } |
| } |
|
| struct SubviewF: View{ |
| var body: some View{ |
| Text("Subview F") |
| } |
| } |
In the real scenario each subview is more complex than a simple Text. It has an image and a Picker, like this.
Code Block | struct SubviewRealExample: View { |
|
| @State var selection = [Int](repeatElement(0, count: 2)) |
|
| var body: some View{ |
| VStack{ |
| ExercisePreview(background: "bgAcuity_thumb", symbol: ViewModel.getImageName()) |
| MultiPicker(data: ViewModel.getData(), selection: $selection) |
| } |
| } |
| } |
I would like selectedView to change every time the selected item in the picker changes. The only way that comes to my mind is the following.
Code Block | struct FirstView: View{ |
| @State var selectedValue = 0 |
| var body: some View{ |
| VStack{ |
| Picker(selection: $selectedValue, label: Text("someText")){ |
| Text("A").tag(0) |
| Text("B").tag(1) |
| Text("C").tag(2) |
| Text("D").tag(3) |
| Text("E").tag(4) |
| Text("F").tag(5) |
| }.pickerStyle(SegmentedPickerStyle()) |
| if (selectedValue == 0){ |
| SubviewA() |
| }else if(selectedValue == 1){ |
| SubviewB() |
| }else if(selectedValue == 2){ |
| SubviewC() |
| }else if(selectedValue == 3){ |
| SubviewD() |
| }else if(selectedValue == 4){ |
| SubviewE() |
| }else if(selectedValue == 5){ |
| SubviewE() |
| }else{ |
| EmptyView() |
| } |
| } |
| } |
| } |
|
| struct SubviewA: View{ |
| var body: some View{ |
| Text("Subview A") |
| } |
| } |
|
| struct SubviewB: View{ |
| var body: some View{ |
| Text("Subview B") |
| } |
| } |
|
| struct SubviewC: View{ |
| var body: some View{ |
| Text("Subview C") |
| } |
| } |
|
| struct SubviewD: View{ |
| var body: some View{ |
| Text("Subview D") |
| } |
| } |
|
| struct SubviewE: View{ |
| var body: some View{ |
| Text("Subview E") |
| } |
| } |
|
| struct SubviewF: View{ |
| var body: some View{ |
| Text("Subview F") |
| } |
| } |
If the subviews were only to be displayed I could use an Anyview array, but I need to access to the subviews state.