一尘不染

如何使用SwiftUI具有动态视图列表

swift

我可以做一个静态列表

List {
   View1()
   View2()
}

但是,如何从数组中动态生成元素列表?我尝试了以下操作,但出现错误: 包含控制流语句的闭包不能与函数生成器“ ViewBuilder”一起使用

    let elements: [Any] = [View1.self, View2.self]

    List {
       ForEach(0..<elements.count) { index in
          if let _ = elements[index] as? View1 {
             View1()
          } else {
             View2()
          }
    }
}

有什么解决办法吗?我要完成的工作是一个列表,其中包含不是静态输入的动态元素集。


阅读 578

收藏
2020-07-07

共1个答案

一尘不染

看起来答案与将我的视图包装在其中有关 AnyView

struct ContentView : View {
    var myTypes: [Any] = [View1.self, View2.self]
    var body: some View {
        List {
            ForEach(0..<myTypes.count) { index in
                self.buildView(types: self.myTypes, index: index)
            }
        }
    }

    func buildView(types: [Any], index: Int) -> AnyView {
        switch types[index].self {
           case is View1.Type: return AnyView( View1() )
           case is View2.Type: return AnyView( View2() )
           default: return AnyView(EmptyView())
        }
    }

这样,我现在可以从服务器获取视图数据并进行组合。而且,仅在需要时才实例化它们。

2020-07-07