78262


## やりたいこと

Tabに複数のタイプのViewを表示させたいのですが、その複数のタイプのViewを持つ`tabList`に複数のタイプのViewを持たせる方法がわかりません。  
コメントアウトした、１つの種類のみならできるのですが、2種類以上追加しようとするとうまくいきません。

## 考えうる方法1

`CustomTab1`と`CustomTab2`にあたらに作成した同じクラスを継承させ、tabListを新たに作成したクラスの配列として宣言する。

※実装方法がわかりません。

## 考えうる方法2

tabListをViewの配列として宣言する

※これもまた実装方法がわかりません。

[code]

    import SwiftUI
    
    struct CustomTab1 : View {
        var body: some View {
            Text("CustomTab1")
        }
    }
    
    struct CustomTab1_Previews: PreviewProvider {
        static var previews: some View {
            CustomTab1()
        }
    }
    
    struct CustomTab2 : View {
        var body: some View {
            Text("CustomTab2")
        }
    }
    
    
    
    struct CustomTab2_Previews: PreviewProvider {
        static var previews: some View {
            CustomTab2()
        }
    }
    
    
    struct Tab: View {
        //var tabList = [CustomTab1(),CustomTab1(),CustomTab1(),CustomTab1()]
        var tabList = [CustomTab1(),CustomTab2(),CustomTab1(),CustomTab2()]
        
        var body: some View {
            TabView {
                ForEach(1..<self.tabList.count) { i in
                    self.tabList[i].body
                        .tag(i)
                        .tabItem {
                            Text("Tab\(i)")
                        }
                }
            }
        }
    }
    
    struct Tab_Previews: PreviewProvider {
        static var previews: some View {
            Tab()
        }
    }
    
[/code]


CC BY-SA 4.0
2021-07-18T03:59:21.180
78261
2021-07-18T04:23:26.173
40856
question
swift swiftui
SwiftUIでTabの個数を可変に色々なViewを表示させたいのですがどうすれば可能でしょうか？


おそらく、やりたいことは下記だと思います。

[How to have a dynamic List of Views using SwiftUI
の回答](https://stackoverflow.com/a/56681450/1979953)

上記を参考に、ご質問に合うように書き換えたものを下記に載せます。

[code]

    import SwiftUI
    
    struct CustomTab1 : View {
      var body: some View {
        Text("CustomTab1")
      }
    }
    
    struct CustomTab1_Previews: PreviewProvider {
      static var previews: some View {
        CustomTab1()
      }
    }
    
    struct CustomTab2 : View {
      var body: some View {
        Text("CustomTab2")
      }
    }
    
    struct CustomTab2_Previews: PreviewProvider {
      static var previews: some View {
        CustomTab2()
      }
    }
    
    
    struct Tab: View {
      var tabList: [Any] = [
        CustomTab1.self,
        CustomTab2.self,
        CustomTab1.self,
        CustomTab2.self
      ]
    
      var body: some View {
        TabView {
          ForEach(0..<tabList.count) { index in
            self.buildView(
              types: self.tabList,
              index: index
            )
          }
        }
      }
    
      func buildView(
        types: [Any],
        index: Int
      ) -> AnyView {
        switch types[index].self {
        case is CustomTab1.Type:
          return AnyView(CustomTab1().tag(index))
        case is CustomTab2.Type:
          return AnyView(CustomTab2().tag(index))
        default:
          return AnyView(EmptyView())
        }
      }
    }
    
    struct Tab_Previews: PreviewProvider {
      static var previews: some View {
        Tab()
      }
    }
    
[/code]


CC BY-SA 4.0
2021-07-18T04:23:26.173
78262
2021-07-18T04:23:26.173
9008
78261
answer